调用free()或delete而不是delete []有危险吗?

Mat*_*ner 6 c++ free memory-management new-operator

可能重复:
(POD)释放内存:删除[]是否等于删除?

是否delete将元素释放到数组中的第一个元素之外?

char *s = new char[n];
delete s;
Run Code Online (Sandbox Code Playgroud)

在上述情况下是否重要,因为所有元素s都是连续分配的,并且不应该delete仅仅是数组的一部分?

对于更复杂的类型,会delete调用超出第一个对象的析构函数吗?

Object *p = new Object[n];
delete p;
Run Code Online (Sandbox Code Playgroud)

如何delete[]推断Object超出第一个的s 数,这是不是意味着它必须知道分配的内存区域的大小?如果出于性能原因为内存区域分配了一些突出怎么办?例如,可以假设并非所有分配器都提供单个字节的粒度.然后,任何特定的分配都可能超过每个元素所需的大小或整个元素.

对于原始类型,例如char,,int之间有什么区别:

int *p = new int[n];
delete p;
delete[] p;
free p;
Run Code Online (Sandbox Code Playgroud)

除了通过delete- > free解除分配机制各自通话所采取的路线?

sha*_*oth 15

它是未定义的行为(很可能会破坏堆或立即崩溃程序),你永远不应该这样做.只有具有与用于分配该内存的原语对应的原语的空闲内存.

违反此规则可能会导致巧合,但一旦发生任何变化(编译器,运行时,编译器设置),程序就会中断.你永远不应该依赖这样的正常运作并期待它.

delete[]使用特定于编译器的服务数据来确定元素的数量.通常在new[]调用时分配更大的块,该数字存储在开头,并且调用者被给予存储的数字后面的地址.无论如何delete[]依赖于被分配的块new[],而不是其他任何东西.如果你配对除了反之外的任何东西new[],delete[]反之亦然,你会遇到未定义的行为.


dir*_*tly 10

阅读常见问题解答:16.3我可以使用new分配free()指针吗?我可以删除用malloc()分配的指针吗?

在上述情况下是否重要,因为s的所有元素是连续分配的,并且不应该只删除数组的一部分?

是的,它确实.

删除[]如何推断超出第一个的对象数量,这是不是意味着它必须知道分配的内存区域的大小?

编译器需要知道.见FAQ 16.11

因为编译器存储了该信息.

我的意思是编译器需要不同的deletes来生成适当的簿记代码.我希望现在很清楚.

  • 如果编译器存储了delete []所需的信息,为什么它不能够聪明地使用普通删除? (3认同)