C++ 删除vs删除[]

C++ 删除vs删除[],c++,pointers,destructor,C++,Pointers,Destructor,我有以下情况 int *arrayP=new int[4]; arrayP[0]=0;arrayP[1]=1;arrayP[2]=2;arrayP[3]=3; int *temp; cout<<arrayP[0]<<endl; temp=arrayP; ++arrayP; cout<<arrayP[0]; cout<<arrayP[1]; delete temp; cout<<arrayP[0]; 为什么会这样?arrayP指向大小为

我有以下情况

int *arrayP=new int[4];
arrayP[0]=0;arrayP[1]=1;arrayP[2]=2;arrayP[3]=3;
int *temp;
cout<<arrayP[0]<<endl;
temp=arrayP;
++arrayP;
cout<<arrayP[0];
cout<<arrayP[1];
delete temp;
cout<<arrayP[0];
为什么会这样?arrayP指向大小为4的数组上的第一个元素。 因此,temp也指向第一个元素
现在,为什么删除temp即第一个元素也会删除整个整数数组。arrayP确实存储数组下一个元素的地址,因此该数组不是孤立的。我假设它删除了整数数组,因为arrayP[0]显示的是垃圾值

如果是这种情况,即删除temp将删除整个整数数组delete[]和delete之间有什么区别。

如果使用new[],则必须将其与delete[]平衡

如果你使用新的,你必须平衡它与删除


混合使用它们将导致内存泄漏/程序崩溃技术上未定义的行为。在你的例子中,C++内部记录你已经创建了4个int;调用DELL[]允许C++访问此记录。调用delete则不行。

现在为什么要删除temp,即第一个ele?请立即停止。不能使用“删除未分配给new的内容”。如果使用new[],则必须使用delete[]。一旦你违反了这条规则,一切都失去了意义。也就是说,为什么会有人使用新的[]:|好吧。因此,假设我的代码不再需要数组的第一个元素,没有办法释放空间。我想避免将它复制到较短的数组中,因为这是一项耗时的工作,如果它不需要数组的第一个元素,但需要其他元素,那么就不要引用它;你真的在乎吗?@user2511713这里没有逻辑定义。一旦删除了分配给new[]的某些内容,行为就未定义。这就是说明书上说的。他断言没有逻辑可以发现,这是技术上的一个亮点,任何人都不会因此而生气。使用标准容器而不是数组。deque似乎就是你想要的。您可能还需要查看boost.circular\u缓冲区。
0
1
2
-1212222