C++ 删除数组指针的元素没有意义吗?
我知道我应该使用C++ 删除数组指针的元素没有意义吗?,c++,C++,我知道我应该使用std::vector或其他替代方法,但我不理解指针 创建指针数组时: int* a = new int[100]; 它应该分配一个100*sizeof(int)的空间,不是吗 当我们不再需要它时,我们会: delete [] a; 1. : 但是,当我真的这样做时(在一个娱乐程序中有一次意外),似乎不会触发运行时错误(如下面第3部分中所述),并且程序正常运行(尽管可能存在内存泄漏)。为什么?它真的删除(释放)了数组的第一个元素吗 2. 根据,delete[]知道需要删除
std::vector
或其他替代方法,但我不理解指针
创建指针数组时:
int* a = new int[100];
它应该分配一个100*sizeof(int)
的空间,不是吗
当我们不再需要它时,我们会:
delete [] a;
1. : 但是,当我真的这样做时(在一个娱乐程序中有一次意外),似乎不会触发运行时错误(如下面第3部分中所述),并且程序正常运行(尽管可能存在内存泄漏)。为什么?它真的删除(释放)了数组的第一个元素吗
2. 根据,
delete[]
知道需要删除的数组的大小
但是当我删除错误的东西时会发生什么呢?(它会导致运行时错误…在codepad.org上,它显示内存在分配块之前被阻塞
,并且VS2010中的某个调试断言失败
)。为什么不直接删除(释放)元素1到99
delete [] &a[1]; // or
delete [] (a + 1);
3. 下面的代码还显示了
内存在分配块之前被阻塞的情况。但是为什么它不删除(释放)元素99呢?为什么它会导致一个错误,而只是像第1部分那样删除一个
就不会了
delete &a[99]; //or
delete (a + 99);
《C++标准》实际上陈述了上述事情会发生什么情况? 为什么?它是否确实删除(释放)了数组的第一个元素? 不,从技术上讲,它导致了一种未定义的行为。这意味着任何事情都可能发生 使用
new
或new[]
的规则非常简单:
- 如果您使用了
,您必须使用new
,如果您使用delete
您必须使用new[]
解除分配delete[]
- 您应该将
或new
返回的地址传递到new[]
或delete
delete[]
因为C++标准是这样说的。
该标准为您提供了通过动态内存分配来管理对象的生命周期和内存的功能,作为回报,您可以签订一份合同,以遵循标准要求的规则来获得该功能。
如果你违反了合同,你就会受到惩罚
new
或new[]
的规则非常简单:
- 如果您使用了
,您必须使用new
,如果您使用delete
您必须使用new[]
解除分配delete[]
- 您应该将
或new
返回的地址传递到new[]
或delete
delete[]
因为C++标准是这样说的。
该标准为您提供了通过动态内存分配来管理对象的生命周期和内存的功能,作为回报,您可以签订一份合同,以遵循标准要求的规则来获得该功能。
如果你违反了合同,你就会受到惩罚
int
;它希望您一次取消分配所有100个项目-您不能以任何其他方式取消分配int
;它希望您一次取消分配所有100个项目-您不能以任何其他方式取消分配这些情况下的内存布局在某种程度上是由实现定义的。我们不应该把这些事情搞砸。使用错误的
delete
格式是错误的。就这么简单。至于1.,这是未定义的行为,因此它与此代码和此编译器一起工作,在其他3个编译器上尝试它,它可能会开始崩溃。所以,未定义的行为是对不遵循规则的事物的普遍解释?@AlvinWong:未定义的行为是一种例外情况,它
delete &a[99]; //or
delete (a + 99);