删除间接指针是否正确

时间:2018-03-11 01:39:15

标签: c++ pointers dynamic-memory-allocation

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

1 个答案:

答案 0 :(得分:3)

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

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[]