删除数组指针的元素没有意义吗?

Alv*_*ong 1 c++

我知道我应该使用std::vector或其他替代方案,但有一些我不明白的指针.

当我们创建一个指针数组时:

int* a = new int[100];
Run Code Online (Sandbox Code Playgroud)

它应该分配一个空间100 * sizeof(int),不是吗?

当我们不再需要它时,我们会这样做:

delete [] a;
Run Code Online (Sandbox Code Playgroud)

1.

这是错的:

delete a;
Run Code Online (Sandbox Code Playgroud)

但是,当我实际执行此操作时(偶然在休闲程序中执行此操作),似乎不会触发运行时错误(下面第3部分中的unllike)并且程序正常运行(尽管可能存在内存泄漏).为什么?它是否真的删除(释放)了数组的第一个元素?


2.

根据StackOverflow上的一个问题,delete[]知道它需要删除的数组的大小.

但是当我删除错误的东西时会发生什么?(它导致运行时错误...在它显示的codepad.org上memory clobbered before allocated block以及Debug Assertion FailedVS2010中的内容.)为什么不删除(免费)元素1到99?

delete [] &a[1]; // or
delete [] (a + 1);
Run Code Online (Sandbox Code Playgroud)

3.

以下代码也显示memory clobbered before allocated block.但为什么不删除(免费)元素99?为什么它会导致错误,但delete a就像第1部分中那样?

delete &a[99]; //or
delete (a + 99);
Run Code Online (Sandbox Code Playgroud)

C++标准是否真的说明了上述内容会发生什么?

das*_*ght 6

  1. 根据C++标准,删除new[]使用分配的对象delete是未定义的行为.任何事情都可能发生 - 从"无所事事"到腐败你的堆超出所有认可.在这样的情况下,确切地说删除了什么是没有意义的,因为它严重依赖于系统.

  2. 删除"错误的东西"是未定义的行为.通常,这会破坏您的堆,因为分配器的常见实现期望某些值存储在您为解除分配传递的地址之前.这绝不是标准,所以任何事情都可能发生.

  3. 它不会删除元素99,因为它从未分配过元素99:它分配了一个包含100个项目的数组,而不是一个int; 它希望您一次解除所有100个项目的释放 - 您无法以任何其他方式解除分配.

  • 标准参考:C++ 11 3.7.4.2-p3,"...如果标准库中提供给operator delete(void*)的值不是上一次调用任何一个运算符返回的值之一,则行为未定义标准库中的new(std :: size_t)或operator new(std :: size_t,const std :: nothrow_t&),如果在标准库中提供给operator delete [](void*)的值是,则行为未定义不是之前调用标准库中的运算符new [](std :: size_t)或operator new [](std :: size_t,const std :: nothrow_t&)返回的值之一. (2认同)