我对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/