【问题标题】:Is it correct to delete indirect pointer删除间接指针是否正确
【发布时间】:2018-03-11 01:39:15
【问题描述】:

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

【问题讨论】:

  • 一个是intP,另一个是intP2....

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2018-08-15
    • 2019-03-14
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多