删除间接指针是否正确

Is it correct to delete indirect pointer

我对C++还是个新手,所以回答时请客气。 当涉及到动态内存管理时,许多教程都给出了下面的示例或类似内容,它们通常在同一范围内。

MyClass * pt;
pt = new MyClass[3];
delete[] pt;

我有一个问题,如果我无法访问原始动态分配的变量但只有它的地址怎么办。考虑以下

int* intP; //Global variable

void SomeFunction()
{
    int* intP2 = new int;
    *intP2 = 10;
    intP = intP2;

    //Some other actions.....and lost access to intP2 when this function ends
}


void SomeOtherFunction()
{
    delete intP; //Valid?
}

此行为是 well-defined:所有指向内存中相同位置的指针都可以删除。事实上,当您在函数内部构造对象时,同样的机制也在起作用,这是一个相当常见的场景:

MyClass *create(size_t size) {
    MyClass *res = new MyClass[size];
    ... // Do something else
    return res;
}
...
MyClass *array = create(100);
...
delete[] array;

这是上面发生的事情:

  • new的结果赋值给res
  • 指针返回给调用者,而原始变量res超出范围
  • 您删除 array 以释放使用 new [] 分配并分配给 create() 函数内的 res 的内存。

在另一个指针仍然可访问的情况下,在删除后取消引用另一个指针是非法的,例如:

int *data = new int[200];
int *copy = data;
...
delete[] copy;
// At this point it becomes illegal to dereference data[]