删除间接指针是否正确

Is it correct to delete indirect pointer

本文关键字:是否 指针 删除      更新时间:2023-10-16

我还是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?
}

此行为定义明确:所有指向内存中相同位置的指针都是删除的公平游戏。事实上,当您在函数内构造对象时,相同的机制也在起作用,这是一种相当常见的场景:

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 []一起分配并分配给函数内部res create()内存。
在另一个指针

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

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