c++ - 删除间接指针是否正确

标签 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?
}

最佳答案

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

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

关于c++ - 删除间接指针是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215800/

相关文章:

c - 如何在C中动态地在数组的最后一个位置插入一个元素?

c - 使用 realloc 动态增长结构数组会导致堆损坏

c++ - 检索 C++ 程序/文件中使用的指针变量列表

c++ - 如何更新我的函数以使用新的 v8 FunctionTemplates?

c++ - 列表 vector 真的是 vector 吗?

用于 xCode 错误的 C++11

c - 尝试通过结构从动态字符串数组打印字符串时出错

c - c中的指针类型转换

c - 如何动态地将新数据添加到二维数组?

c++ - 请求 ‘mCar’中的成员 ‘this’,非类类型 ‘owner* const’