C++ 在这种情况下,是否会取消分配数组?

C++ 在这种情况下,是否会取消分配数组?,c++,C++,重新定位数组指针是否会影响delete运算符的工作 案例(1) 案例(2) 案例(3) 编辑:[案例2和3]未定义。操作员可能会根据其地址搜索要取消分配的对象,但无法找到该对象。不要在家里尝试;) 阅读更多 原始问题的原始答案——对于案例1: 您的代码并没有真正重新定位数组;最终,传递给delete[]运算符的地址与new[]运算符分配的地址相同(并由new[]运算符返回)。总的来说,这里delete[]的功能是安全的和定义的。您只是在递增和递减指针。您不是在“重新定位”任何东西。更改指针的值都

重新定位数组指针是否会影响delete运算符的工作

案例(1)

案例(2)

案例(3)


编辑:[案例2和3]未定义。操作员可能会根据其地址搜索要取消分配的对象,但无法找到该对象。不要在家里尝试;)

阅读更多

原始问题的原始答案——对于案例1:
您的代码并没有真正重新定位数组;最终,传递给delete[]运算符的地址与new[]运算符分配的地址相同(并由new[]运算符返回)。总的来说,这里delete[]的功能是安全的和定义的。

您只是在递增和递减指针。您不是在“重新定位”任何东西。更改指针的值都不会以任何方式影响它指向(或用于指向)的对象。指针只是指向其他对象的变量-就像一个符号说“它在那边”,当您更改符号时,它不会更改“那边”的对象@NephewofStackoverflow在得到答案后,请不要更改问题。案例2和3都是未定义的行为。您不能
删除
ing您
新建的
ed。未定义的行为:“如果违反语言的某些规则,则会使整个程序失去意义”来源:未定义的行为也可能导致时间旅行来源:进一步阅读UB:Part 1/3:和另一个Part 1/3,那么如果我调用未递减a会发生什么?我已更新了问题描述,抱歉给您带来不便。它未定义。操作员可能会根据我建议澄清三种情况中哪些是UB。UB是C程序员常用的快捷方式,代表“未定义的行为”。
int main(){
   int *a = new int[5];
   a++; a--;
   delete[] a;
   return 0;
 }
int main(){
   int *a = new int[5];
   a++;
   delete[] a;
   return 0;
 }
int main(){
   int *a = new int[5];
   a++;
   delete[] a;
   a--;
   delete[] a;
   return 0;
 }