如果将 delete[] 应用于非数组指针会发生什么情况
What happens if you apply delete[] to a non-array pointer?
如果将"delete"而不是"delete[]"应用于C++中的数组,则会产生内存泄漏,因为只会删除第一个元素。但是,如果您意外地将"delete[]"应用于非数组指针会发生什么?例如(只是一个玩具示例):
class X {
void foo()
{
X* x = new X();
delete[] x; // What happens here?
}
};
它能造成任何伤害吗?如果是这样,有什么害处?
如果在 C++ 中对数组应用"delete"而不是"delete[]",则会创建内存泄漏,因为只会删除第一个元素。
这并非总是正确的。因为new、new[]、delete、delete[]运算符也可以重载,所以使用delete而不是delete[](或相反)可以产生巨大的差异。
此外,某些编译器使用此处描述的过度分配技术。因此,在非数组指针上应用 delete[] 会导致未定义的行为。
如果在需要delete[]
的地方使用简单的delete
,则不会有内存泄漏,你有未定义的行为。 在很多情况下,你会破坏自由空间竞技场,导致以后的程序崩溃,但是当然,未定义的行为是未定义的,因此任何事情都可能发生。
在需要简单delete
的情况下使用delete[]
也是未定义的行为;在实践中,它也经常导致腐败自由太空竞技场,或其他丑陋的结果。
当然,在实践中,我无法想到你在哪里将使用新的数组,因此您几乎可以忘记delete[]
.
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 属于副本被推送到矢量的对象的指针会发生什么情况?
- 将指针分配给另一个指针时会发生什么情况?
- 指针与参考示例,在什么情况下更好
- 如果原始指针被删除shared_ptr,会发生什么情况?
- 在C++中对指针进行类型转换"sideways"时会发生什么情况
- 创建此指针后会发生什么情况
- 如果没有指针会发生什么情况,获取工厂函数指针
- 如果将 delete[] 应用于非数组指针会发生什么情况
- 如果指针超出范围会发生什么情况
- 当我在 C++ 中对未初始化的指针调用"delete"时会发生什么情况?
- 当线程的 void 指针在运行时发生更改时会发生什么情况?
- 指针下溢或溢出时会发生什么情况
- 我在不使用指针的情况下得到"Segmentation Fault"。发生了什么事情?
- (C++) 堆上没有任何指针的对象会发生什么情况?
- "re-initialize"指针时会发生什么情况
- 在什么情况下'this'指针传递给类方法?