代码之家  ›  专栏  ›  技术社区  ›  Eds

删除间接指针是否正确

  •  2
  • Eds  · 技术社区  · 7 年前

    我对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 回复  |  直到 7 年前
        1
  •  3
  •   Sergey Kalinichenko    7 年前

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

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