为什么我不能将元素重新分配给使用 delete [] 解除分配的数组?

Why can't I reassign elements to an array that was deallocated with delete []?

本文关键字:delete 解除分配 数组 元素 不能 新分配 分配 为什么      更新时间:2023-10-16

我正在调查delete[]操作符,我想知道这-为什么我不能使另一个数组元素的分配相同的指针,我删除了早些时候使用'delete[]'操作符?

我是这样做的:

int *a = new int[n];
cout << "Enter array elements:" << endl;
for (int i = 0; i < n; i++)
    cin >> a[i];
cout << "a address: " << &a << " points to: " << a << endl;
cout << "a: "; printArray(a,n);
delete [] a; cout << "deletes a" << endl;
cout << "Enter new a elements:" << endl;
for (int i = 0; i < n; i++)
    cin >> a[i];
cout << "a address: " << &a << " points to: " << a << endl;
cout << "a: "; printArray(a,n);

输出为:

Enter array elements: 1 1 1
a address: 0025FAAC points to: 001172C8
a: 1 1 1
deletes a
Enter new a elements: 2 2 2
a address: 0025FAAC points to: 001172C8
a: -572662307 -572662307 -572662307

这是什么原因?

这样做:

int * x = new int[3];
x[0] = 1;
x[2] = 2;
delete [] x;
x[0] = 3; // <-- Undefined Behavior!

对指向已删除内存的指针解引用是未定义行为

继续使用该指针将导致程序以未定义的方式运行,包括可能崩溃或出现任何其他问题。

话虽如此,x只是一个变量。所以我们可以继续用这个变量。我们不能继续使用所指向的。让我们看一些代码来解释这一点:

int * x = new int[3];
x[0] = 1;
x[2] = 2;
delete [] x;
x = NULL;
x = new int[4];
x[3] = 4; // <-- This is fine.

您没有重新分配数组:

int *a = new int[n];
...
cin >> a[i]
...
delete [] a;
...
// here you must allocate a new array
...
cin >> a[i];

一旦您删除了数组,堆上可用的内存不再可用,您将数据存储在您的第二个cin中,您不应该在这里存储数据。在您的示例中,此地址0x001172C8在删除后无效。分配一个新的数组应该为你提供一个新的地址(通常)。

根据标准草案,

18.6.1.2/9

void operator delete[](void* ptr) noexcept;

效果:由delete-expression的数组形式调用的deallocation函数(3.7.4.2)使ptr的值无效。

执行

因此,

delete [] a;

使a无效,根据标准。如果某个平台允许a在此之后使用而不会崩溃或其他奇怪的行为,则只是运气问题。