为什么在分配了'new'的指针上调用free()会导致堆损坏?

时间:2010-08-17 18:46:12

标签: c++ memory heap

它是否真的可以在某些编译器/机器上运行,但在其他编译器/机器上会导致堆损坏和崩溃?

有没有人对隐藏的内容有任何见解?

3 个答案:

答案 0 :(得分:18)

当你使用delete时,C ++想要在对象上调用析构函数,但是将它传递给free不允许这种情况发生。如果对象包含其他对象,则也不会调用这些对象的析构函数。如果对象中有指针,那么那些就不会被释放。

此外,C ++的newdelete实际上可以从malloc请求更大量的内存并使用额外的内容来保存(比如存储析构函数的地址),等等传递给free的指针实际上不是malloc编辑的指针。

答案 1 :(得分:2)

标准说你必须完全匹配分配/解除分配功能(new - deletenew[] - delete[]malloc - {{1 }})。从理论上讲,有些编译器很可能将free实现为一个简单的operator new(),因此它不会导致崩溃,而是“仅”跳过析构函数调用(这本身就很糟糕)。但是,malloc()可以在分配的内存块中存储元素的数量,在这种情况下,operator[]返回的地址指向由new[]分配的某个块内(不是开头),这意味着您无法使用malloc()释放它。

答案 2 :(得分:2)

新操作员也可以超载。如果有人编写了一个新的运算符来执行一些非常不同的操作,比如从内存池中获取指针,那么在这些指针上调用free可能会非常危险。