它是否真的可以在某些编译器/机器上运行,但在其他编译器/机器上会导致堆损坏和崩溃?
有没有人对隐藏的内容有任何见解?
答案 0 :(得分:18)
当你使用delete
时,C ++想要在对象上调用析构函数,但是将它传递给free
不允许这种情况发生。如果对象包含其他对象,则也不会调用这些对象的析构函数。如果对象中有指针,那么那些就不会被释放。
此外,C ++的new
和delete
实际上可以从malloc
请求更大量的内存并使用额外的内容来保存(比如存储析构函数的地址),等等传递给free
的指针实际上不是malloc
编辑的指针。
答案 1 :(得分:2)
标准说你必须完全匹配分配/解除分配功能(new
- delete
,new[]
- delete[]
,malloc
- {{1 }})。从理论上讲,有些编译器很可能将free
实现为一个简单的operator new()
,因此它不会导致崩溃,而是“仅”跳过析构函数调用(这本身就很糟糕)。但是,malloc()
可以在分配的内存块中存储元素的数量,在这种情况下,operator[]
返回的地址指向由new[]
分配的某个块内(不是开头),这意味着您无法使用malloc()
释放它。
答案 2 :(得分:2)
新操作员也可以超载。如果有人编写了一个新的运算符来执行一些非常不同的操作,比如从内存池中获取指针,那么在这些指针上调用free可能会非常危险。