这些描述看起来几乎是一样的。这两者之间是否有任何细微差别值得注意?为什么有人会用一个而另一个呢?Tcl_Alloc()和malloc()也可能会提出这个问题。
发布于 2020-02-21 12:45:36
之所以使用它们,是因为Tcl支持在Windows上构建一个工具链,并加载使用不同工具链构建的DLL。该场景的一个关键特性是,不同的工具链拥有自己的C库实现是相当常见的,这意味着malloc()的不同实现。您必须将malloc()和free()匹配到同一个库,否则会出现一些真正奇怪的故障(崩溃、内存泄漏等)。通过提供Tcl_Alloc和Tcl_Free (通常是非常薄的包装器),用户代码就可以正确地匹配分配和发布。
发布于 2020-02-21 20:00:04
这通常是最明显的理由:
通常,使用您自己版本的内存分配函数的最佳原因是有一个单一的定义,它允许您将内存分配器更改为不同的分配器。(使用安全选项等进行调试、扩展或实现)
只需假设您有以下实现:
void *my_malloc(size_t siz)
{
return malloc(siz);
}
void my_free(void *ptr)
{
free(ptr);
}在allocator_malloc.c中定义
对于一个特殊的客户X,您已经获得了新的ACME分配器的许可证。对于此客户,您可以将您的可执行文件链接到包含以下内容的文件allocator_ACME.c:
void *my_malloc(size_t siz)
{
return ACME_malloc(siz);
}
void free(void *ptr)
{
ACME_free(ptr);
}然后,只需将可执行文件与一个或另一个文件链接,就会生成标准库malloc()的依赖项,否则就必须提供ACME_malloc()函数的实现。通过这种方式,只要更改几个对象文件中的一个,就会将整个依赖项(假设您的源文件中有my_malloc()和my_free()的定义)更改为几个不同的实现之一。
缺点是您有一个级别的函数调用更多,因此在某些情况下,必须使用更软的解决方案。
假设您购买了一个自动垃圾收集器,因此不需要返回使用malloc分配的内存,对于某些魔术,库将检测到您没有更多地使用它,并且垃圾自动收集它:
void *my_malloc(size_t siz)
{
return GC_malloc(siz);
}
void my_free(void *ptr)
{
/* empty */
}https://stackoverflow.com/questions/60323676
复制相似问题