首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`Tcl_Free()`与‘`free()’有什么不同?

`Tcl_Free()`与‘`free()’有什么不同?
EN

Stack Overflow用户
提问于 2020-02-20 15:44:57
回答 2查看 113关注 0票数 1

这些描述看起来几乎是一样的。这两者之间是否有任何细微差别值得注意?为什么有人会用一个而另一个呢?Tcl_Alloc()malloc()也可能会提出这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-21 12:45:36

之所以使用它们,是因为Tcl支持在Windows上构建一个工具链,并加载使用不同工具链构建的DLL。该场景的一个关键特性是,不同的工具链拥有自己的C库实现是相当常见的,这意味着malloc()的不同实现。您必须将malloc()free()匹配到同一个库,否则会出现一些真正奇怪的故障(崩溃、内存泄漏等)。通过提供Tcl_AllocTcl_Free (通常是非常薄的包装器),用户代码就可以正确地匹配分配和发布。

票数 3
EN

Stack Overflow用户

发布于 2020-02-21 20:00:04

这通常是最明显的理由:

通常,使用您自己版本的内存分配函数的最佳原因是有一个单一的定义,它允许您将内存分配器更改为不同的分配器。(使用安全选项等进行调试、扩展或实现)

只需假设您有以下实现:

代码语言:javascript
复制
void *my_malloc(size_t siz)
{
    return malloc(siz);
}

void my_free(void *ptr)
{
    free(ptr);
}

allocator_malloc.c中定义

对于一个特殊的客户X,您已经获得了新的ACME分配器的许可证。对于此客户,您可以将您的可执行文件链接到包含以下内容的文件allocator_ACME.c

代码语言:javascript
复制
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分配的内存,对于某些魔术,库将检测到您没有更多地使用它,并且垃圾自动收集它:

代码语言:javascript
复制
void *my_malloc(size_t siz)
{
    return GC_malloc(siz);
}

void my_free(void *ptr)
{
    /* empty */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60323676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档