gpt4 book ai didi

c - 这是释放内存的好方法吗?

转载 作者:行者123 更新时间:2023-11-30 16:55:49 26 4
gpt4 key购买 nike

释放struct Foo实例的函数如下:

void DestroyFoo(Foo* foo)
{
if (foo) free(foo);
}

我的一位同事建议如下:

void DestroyFoo(Foo** foo)
{
if (!(*foo)) return;
Foo *tmpFoo = *foo;
*foo = NULL; // prevents future concurrency problems
memset(tmpFoo, 0, sizeof(Foo)); // problems show up immediately if referred to free memory
free(tmpFoo);
}

我发现释放后将指针设置为 NULL 更好,但我不确定以下内容:

  1. 我们真的需要将指针分配给临时指针吗?它对并发和共享内存有帮助吗?

  2. 将整个 block 设置为 0 以强制程序崩溃或至少输出具有显着差异的结果真的是一个好主意吗?

最佳答案

Do we really need to assign the pointer to a temporary one? Does it help in terms of concurrency and shared memory?

它与并发或共享内存无关。这毫无意义。

Is it really a good idea to set the whole block to 0 to force the program to crash or at least to output results with significant discrepancy?

没有。一点也不。

你同事建议的解决方案很糟糕。原因如下:

  • 将整个 block 设置为 0 也没有任何效果。因为有人意外地使用了 free() 的 block ,所以他们不会根据该 block 的值知道这一点。这就是 calloc() 返回的那种 block 。因此不可能知道它是新分配的内存(calloc()malloc()+memset())还是由代码 free() 释放的内存早些时候。如果有什么不同的话,那就是你的程序需要额外的工作来将每个被 free() 释放的内存块清零。

  • free(NULL); 定义明确且无操作,因此 if(ptr) {free 中的 if 条件(ptr);} 什么也没实现。

  • 由于 free(NULL); 是无操作的,因此将指针设置为 NULL 实际上会隐藏该错误,因为如果某个函数实际上正在调用 free() 在一个已经 free()ed 的指针上,那么他们就不会知道这一点。

  • 大多数用户函数在开始时都会进行 NULL 检查,并且可能不会考虑将 NULL 传递给它作为错误条件:

void do_some_work(void *ptr) {
if (!ptr) {
return;
}

/*Do something with ptr here */
}

因此,所有这些额外的检查和清零给人一种虚假的“稳健性”感觉,而它并没有真正改善任何东西。它只是用另一个问题替代了另一个问题:额外的性能成本和代码膨胀。

因此,仅调用 free(ptr); 而不使用任何包装函数既简单又健壮(大多数 malloc() 实现会在双重释放时立即崩溃,这是一个好事)。

没有简单的方法可以避免“意外”调用 free() 两次或更多次。程序员有责任跟踪所有分配的内存并适本地free()它。如果有人觉得这很难处理,那么 C 可能不是适合他们的语言。

关于c - 这是释放内存的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40192887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com