调用free()或删除而不是delete []会有危险吗?
可能重复:
(POD)释放内存:是否删除[]等于删除?
delete
是否释放数组中的第一个元素?
char *s = new char[n];
delete s;
在上面的情况下,看到s
所有元素是连续分配的,并且不应该只能delete
数组的一部分吗?
对于更复杂的类型,会delete
调用第一个对象的析构函数吗?
Object *p = new Object[n];
delete p;
如何delete[]
推断超出第一个Object
的数量,是不是这意味着它必须知道分配内存区域的大小? 出于性能方面的原因,如果内存区域分配了一些突出部分会怎样? 例如,可以假设并非所有的分配器都会提供单个字节的粒度。 然后,任何特定的分配可能会超过每个元素所需的大小或整个元素。
对于基本类型,如char
, int
,是否有以下区别:
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[]
是合法的。
上一篇: Is there any danger in calling free() or delete instead of delete[]?
下一篇: When is it appropriate to use static (over unnamed namespaces) in C++?