Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除数组类型指针的元素是否导致错误?_C++_Memory_Memory Management - Fatal编程技术网

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