C++ 删除数组类型指针的元素是否导致错误?
我举一个例子:C++ 删除数组类型指针的元素是否导致错误?,c++,memory,memory-management,C++,Memory,Memory Management,我举一个例子: int* arr = new int[1]; //First Time arr[0] = 5; cout << &arr[0] << " " << arr[0] << endl; delete &arr[0]; cout << &arr[0] << " " << arr[0] << endl; //Second time arr[0] = 5; cout &l
int* arr = new int[1];
//First Time
arr[0] = 5;
cout << &arr[0] << " " << arr[0] << endl;
delete &arr[0];
cout << &arr[0] << " " << arr[0] << endl;
//Second time
arr[0] = 5;
cout << &arr[0] << " " << arr[0] << endl;
delete &arr[0]; //Error from here
cout << &arr[0] << " " << arr[0] << endl;
我不知道为什么它会让我出错?它不允许我第二次删除
arr[0]
,即使第一次成功删除并为其分配了一个新值。如果使用new[]
动态分配数组,则必须使用delete[]
删除它,这将释放整个数组。不能释放单个元素。您的代码具有未定义的行为,因为您使用了delete
而不是delete[]
,所以任何事情都可能发生。仅仅因为它看起来有效并不意味着它是正确的。如果您使用new[]
动态分配一个数组,您必须使用delete[]
删除它,这将释放整个数组。不能释放单个元素。您的代码具有未定义的行为,因为您使用了delete
而不是delete[]
,所以任何事情都可能发生。仅仅因为它看起来有效并不意味着它是正确的。未定义的行为
&arr[0]
是arr
衰减到的相同内存地址。所以你真的在调用delete arr代码>。这是未定义的行为,因为当您需要使用delete[]
时,您正在使用delete
。使用new
分配的内存必须通过delete
释放。使用new[]
分配的内存必须通过delete[]
释放
但是,让我们假设编译器的运行时在分配的数组元数据中有足够的信息来正确释放数组<代码>删除
'ing一个数组释放整个数组。无法释放数组中的单个元素。释放整个数组后访问数组的任何元素都是未定义的行为。调用delete arr后,您正在访问arr[0]
以释放阵列。您没有为指向的arr
分配新数组。幸运的是,您的代码没有完全崩溃
这就是未定义行为的定义——任何事情都可能发生。您可以在旧内存被覆盖之前读取它。你可以从随机记忆中阅读。你可能会破坏记忆。您可能会崩溃。未定义的行为
&arr[0]
是arr
衰减到的相同内存地址。所以你真的在调用delete arr代码>。这是未定义的行为,因为当您需要使用delete[]
时,您正在使用delete
。使用new
分配的内存必须通过delete
释放。使用new[]
分配的内存必须通过delete[]
释放
但是,让我们假设编译器的运行时在分配的数组元数据中有足够的信息来正确释放数组<代码>删除
'ing一个数组释放整个数组。无法释放数组中的单个元素。释放整个数组后访问数组的任何元素都是未定义的行为。调用delete arr后,您正在访问arr[0]
以释放阵列。您没有为指向的arr
分配新数组。幸运的是,您的代码没有完全崩溃
这就是未定义行为的定义——任何事情都可能发生。您可以在旧内存被覆盖之前读取它。你可以从随机记忆中阅读。你可能会破坏记忆。你可能会崩溃。仅仅因为第一次删除看起来有效,并不意味着它成功了。你想完成什么?你删除某个东西,然后继续,就好像该东西仍然有效一样。爆炸的基本方法。我想你应该解释为什么你认为这应该有效。(忘了第二次删除吧;为什么要先删除
delete&X;
然后再删除X=5;
这样的内容才有效?)仅仅因为第一次删除看起来有效,并不意味着它有效。你想完成什么?你删除某个东西,然后继续,就好像该东西仍然有效一样。爆炸的基本方法。我想你应该解释为什么你认为这应该有效。(忘记第二次删除;为什么delete&X;
后接X=5;
这样的形式的东西会起作用?)。编程中可能没有比这更可怕的了。。编程中可能没有比这更可怕的了。
00529EF0 5
00529EF0 -572662307
00529EF0 5
//Where the code stop