我知道我应该使用std::vector
或其他替代方案,但有一些我用指针无法理解的东西。
当我们创建指针数组时:
int* a = new int[100];
它应该分配100 * sizeof(int)
的空格,不是吗?
当我们不再需要它时,我们会这样做:
delete [] a;
1
delete a;
但是当我实际执行此操作时(偶然在休闲程序中执行此操作),似乎不会触发运行时错误(下面第3部分中的unllike)并且程序正常运行(尽管可能存在内存泄漏)。为什么?它实际上是删除(释放)数组的第一个元素吗?
2
根据a question on StackOverflow,delete[]
知道需要删除的数组的大小。
但是当我删除错误的东西时会发生什么? (它导致运行时错误...在codepad.org上显示memory clobbered before allocated block
和VS2010中的Debug Assertion Failed
。)为什么不删除(免费)元素1到99?
delete [] &a[1]; // or
delete [] (a + 1);
第3
以下代码还显示了memory clobbered before allocated block
。但为什么不删除(免费)元素99?为什么它会导致错误,但只有delete a
就像第1部分中那样?
delete &a[99]; //or
delete (a + 99);
C ++标准是否真的说明了上述内容会发生什么?
答案 0 :(得分:6)
根据C ++标准,使用new[]
删除使用delete
分配的对象是未定义的行为。任何事情都可能发生 - 从“无所事事”到腐败你的堆超出所有认可。在这种情况下,确切地说删除了什么是没有意义的,因为它严重依赖于系统。
删除“错误的东西”是未定义的行为。通常,这会破坏您的堆,因为分配器的常见实现期望某些值存储在您为解除分配传递的地址之前。这绝不是标准,所以任何事情都可能发生。
它不会删除元素99,因为它从未分配过元素99:它分配了一个包含100个项目的数组,而不是一个int
;它希望您一次解除所有100个项目的释放 - 您无法以任何其他方式解除分配。
答案 1 :(得分:4)
<强>为什么呢?它是否实际删除(释放)了数组的第一个元素?
不,从技术上讲,它会导致未定义的行为。这意味着什么都可能发生。
使用new
或new []
的规则非常简单:
new
,必须使用delete
,如果您使用new []
,必须使用delete[]
解除分配。new
或new []
返回的地址传递给delete
或delete []
。您不遵守规则,最终会得到未定义的行为。
因为C ++标准是这样说的
该标准为您提供了通过动态内存分配来管理对象的生命周期和内存的功能,作为回报,您签订了一份合同,以遵循标准要求获得此功能的规则。
你打破了你受到处罚的合同。
简而言之,
“更大的力量带来了更大的责任”