正在使用另一个指针删除动态数组

Deleting dynamic array using another pointer

本文关键字:删除 动态 数组 指针 另一个      更新时间:2023-10-16

情况是:

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关键字,从而使其停止使用。