c - C中的双重释放没有错误

标签 c memory-management free

<分区>

我有一个非常大的代码,包含 malloc、free、loop 等。有时,我需要很长时间才能弄清楚问题出在哪里,因为我在程序的一部分收到错误,但真正导致问题的是什么在代码中是遥远的东西。大多数问题是由我没有注意到的double free引起的。但其中一些在一段时间内运行良好,然后就崩溃了。

因此,请考虑一个大多数情况下都有效的示例:

int main() {

    char *x = (char*) malloc(10);
    char *y = (char*) malloc(10);

    free(x);
    free(y);

    x = (char*) malloc(10);
    free(y); // Am I lucky?

    return 0;

}

为什么我在运行第二个 free(y) 时没有收到错误消息?我检查了第二个malloc 之后的x 的指针是否等于先前分配的y 地址。它并不总是有效。有时它会崩溃。

所以,我的问题是:有什么方法可以在尝试执行双重释放时强制执行错误?

谢谢!

最佳答案

在 free() 之后,将指针设置为 null 以避免“释放​​”同一地址。

Free() 不会改变指针的值,因此程序可以重用该地址来分配新 block 。

Free(null) 什么都不做,也不会破坏您的代码。

关于c - C中的双重释放没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691586/

相关文章:

memory-management - 如何在 Lua 中成功使用 Loki 的小对象分配器?

c - 免费二维字符数组

c - execv和execve的区别

将函数指针转换为另一种类型

c++ - 排队对象的分配策略

swift - 有没有办法检查 `unowned` (实际上是 `unowned(safe)` )引用已被取消?

c - 线程练习。交替打印两个不同线程的 id

c - 32 位 g++ 和 64 位 g++ 中的 printf() 处理参数的方式不同?

使用任意节点类型在 C 中创建堆。如何释放它?

c - 何时在 C 中使用可变长度数组,但何时使用动态分配?