删除间接指针是否正确
Is it correct to delete indirect pointer
我对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?
}
此行为是 well-defined:所有指向内存中相同位置的指针都可以删除。事实上,当您在函数内部构造对象时,同样的机制也在起作用,这是一个相当常见的场景:
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[]
我对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?
}
此行为是 well-defined:所有指向内存中相同位置的指针都可以删除。事实上,当您在函数内部构造对象时,同样的机制也在起作用,这是一个相当常见的场景:
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[]