正在使用另一个指针删除动态数组
Deleting dynamic array using another pointer
情况是:
int main ()
{
int *p1 = new int[50];
int *p2 = p1;
...
当我想删除我的数组时,我会:
delete[] p1;
我也可以用这个做吗:
delete[] p2;
两个指针都指向同一内存,因此在delete[]
时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。所以,如果你做delete[] p1;
,那么你就不能做delete[] p2;
,这是其中之一。
如果不深入研究细节,删除运算符的定义看起来像
delete expression
delete [ ] expression
正如您所看到的,它使用了一个表达式(更准确地说是一个强制转换表达式)。例如,你可以写
int *p1 = new int[50];
int *p2 = p1 + 50;
delete [] ( p2 - 50 );
(请注意,您必须将表达式p2-50括在括号中。)
对表达式进行求值,并将其值用作要删除的内存的地址。
删除内存后,您可能无法访问它。否则,程序的bahaviour将未定义。
由于p2指向p1分配的同一内存块,因此是的,p2可用于擦除该内存块。
您可以通过运行以下代码来验证。。。
#include <iostream>
using namespace std;
int main()
{
int* p1 = new int[10];
int* p2 = nullptr;
for (int i = 0; i < 10; i++) {
p1[i] = i * i;
}
// 1st run
for (int i = 0; i < 10; i++) {
cout << p1[i] << " ";
}
cout << endl;
p2 = p1;
if (p2 != nullptr) {
delete p2;
}
// 2nd run;
for (int i = 0; i < 10; i++) {
cout << p1[i] << " ";
}
p1 = nullptr;
p2 = nullptr;
return 0;
}
对p1数组的第二次运行显示,该数组的内容已被delete p2
操作删除,为了安全起见,该操作被放入if语句中。
一旦结束使用,可以将这两个指针等同于nullptr
关键字,从而使其停止使用。
相关文章:
- 删除动态数组时未定义标识符
- 删除动态数组上不带方括号的内容
- 如何在C++中删除动态数组的列
- 使用私有析构函数删除动态分配的对象
- 删除动态数组会弄乱我的结果
- 删除动态数组会导致运行时错误
- 删除动态字符串时程序崩溃
- 从函数中删除动态大小的数组
- 删除动态分配数组的 1 个元素
- 在C 中删除动态创建的矩阵
- 删除动态对象的错误
- C++ 在类中删除动态 2D 数组时不断"Aborted (core dumped)"
- 从函数中删除动态内存分配,但无法访问变量
- 删除动态数组后,其绑定的某些值不会更改.为什么
- 关于删除动态对象数组
- 如果我不删除动态创建的变量会发生什么
- 错误在删除动态分配的2D数组期间发生
- 删除动态分配的数组C
- 删除动态数组的一部分
- C++删除动态数组只删除第一个元素