繁体   English   中英

为什么调用`free(malloc(8))`?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM