[英]Why calling `free(malloc(8))`?
Objective-C 运行时的hashtable2.mm
文件包含以下代码:
static void bootstrap (void) {
free(malloc(8));
prototypes = ALLOCTABLE (DEFAULT_ZONE);
prototypes->prototype = &protoPrototype;
prototypes->count = 1;
prototypes->nbBuckets = 1; /* has to be 1 so that the right bucket is 0 */
prototypes->buckets = ALLOCBUCKETS(DEFAULT_ZONE, 1);
prototypes->info = NULL;
((HashBucket *) prototypes->buckets)[0].count = 1;
((HashBucket *) prototypes->buckets)[0].elements.one = &protoPrototype;
};
为什么它会立即分配和释放 8 字节空间?
另一个混淆的来源是objc-os.h
中的这个方法:
static __inline void *malloc_zone_malloc(malloc_zone_t z, size_t size) { return malloc(size); }
虽然它只使用一个参数,但签名是否需要两个参数?
对于第一个问题,我只能假设。 我敢打赌,这样做是为了避免/减少 memory 流失,或出于其他原因对 memory 进行分段。 您可以在bmalloc
的变更日志中简要找到它的讨论位置(这不太相关,但我找不到更好的参考):
2017-06-02 杰弗里·盖伦 <ggaren@apple.com>
...
更新了新的 API。 请注意,我们每页缓存一个空闲块 class。 这样可以避免在
free(malloc(X))
时大分配器中的流失
然而,尚不清楚 memory 流失是由这种技术引起的,还是应该解决的。
对于第二个问题,Objective-C 运行时曾经与“区域”一起工作,以便通过破坏所述区域来破坏所有分配的变量,但事实证明它容易出错,后来同意不再使用它。 API,但由于历史原因(我假设向后兼容性)仍然使用它,但表示区域被忽略:
iOS 和 OS X 上的 64 位运行时忽略区域。在当前开发中不应使用区域。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.