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

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

delete是否释放数组中的第一个元素?

char *s = new char[n];
delete s;

在上面的情况下,看到s所有元素是连续分配的,并且不应该只能delete数组的一部分吗?

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

Object *p = new Object[n];
delete p;

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

对于基本类型,如charint ,是否有以下区别:

int *p = new int[n];
delete p;
delete[] p;
free p;

除了通过delete - > free重新分配机制的相应调用所采用的路由外,


这是未定义的行为(很可能会破坏堆或立即崩溃程序),你永远不应该这样做。 只有与用于分配内存的基元相对应的可用内存。

违反这一规则可能会导致恰当的功能正常运行,但一旦发生任何变化,程序就会中断 - 编译器,运行时和编译器设置。 你永远不应该依赖这种正常的功能,并期待它。

delete[]使用编译器特定的服务数据来确定元素的数量。 当调用new[]时,通常会分配一个更大的块,该数字将存储在开始处,并且调用方将给出地址在存储的数字后面。 无论如何, delete[]依赖于由new[]分配的块,而不是其他任何东西。 如果您将除new[]之外的任何内容与delete[]配对,反之亦然,则会遇到未定义的行为。


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

在上面的情况下,看到s的所有元素是连续分配的,并且不应该只能删除数组的一部分吗?

是的,它确实。

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

编译器需要知道。 请参阅FAQ 16.11

因为编译器存储该信息。

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


是的,这很危险!

不要这样做!

它会导致程序崩溃或更糟糕的行为!

对于new分配的对象, 必须使用delete ;

对于分配了new []对象,你必须使用delete [] ;

对于分配了malloc()calloc()必须使用free() ;

请注意,对于所有这些情况,第二次删除/释放已删除/释放的指针都是非法的。 free也可能不会被调用null。 用NULL调用delete/delete[]是合法的。

链接地址: http://www.djcxy.com/p/72991.html

上一篇: Is there any danger in calling free() or delete instead of delete[]?

下一篇: When is it appropriate to use static (over unnamed namespaces) in C++?