为什么我不能将元素重新分配给使用 delete [] 解除分配的数组?
Why can't I reassign elements to an array that was deallocated with delete []?
我正在调查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
在此之后使用而不会崩溃或其他奇怪的行为,则只是运气问题。
相关文章:
- 指针会被解除分配吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 解除分配矩形 2D 数组会根据尺寸产生错误
- 为什么在正确解除分配内存时出现内存泄漏?
- 堆栈变量超出范围时是否解除分配?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在 QStandardItemModel 中解除分配项目
- 解除分配此特定 2D 阵列的内存
- C++删除数组只会解除分配第一项
- 在 c++ 中使用向量解除分配
- 与解除分配堆数组相关的语法混淆
- 解除分配与 C++ 中的结构关联的所有内存
- 是否随作用域分配和解除分配堆栈帧
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 如果清除了 std::map 是否确保内存被解除分配
- 在另一个结构中的结构内解除分配指针
- 由 strcpy 设置的解除分配字符 * 时内存泄漏?
- 自定义内存分配和多个继承类的解除分配
- 在回溯中使用“delete”解除分配时,出现“free()”错误
- 为什么我不能将元素重新分配给使用 delete [] 解除分配的数组?