我还是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?
}
答案 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[]