在C++中,如果你将一个指向指针的指针传递给一个方法,你需要首先删除被引用的指针吗?你需要在方法内部清理它吗?我在任务管理器中检查内存,发现有泄漏!
谢谢!
在C++中,如果你将一个指向指针的指针传递给一个方法,你需要首先删除被引用的指针吗?你需要在方法内部清理它吗?我在任务管理器中检查内存,发现有泄漏!
谢谢!
int** p = 0;
p = new int*; // create first pointee
*p = new int; // create 2nd pointee
**p = 0; // assign 2nd pointee
// free everything
delete *p;
delete p;
对我来说,删除传递给方法的指针似乎是不寻常的。但无论如何:
void freeme(int **p) {
delete *p;
*p = 0;
}
int main() {
int *a = new int;
*a = 3;
freeme(&a);
// a == 0 now
}
"指向指针的指针" ?
例如,如果您有:
MyClass * obj_ptr = new Myclass();
MyClass ** obj_ptr_ptr = &obj_ptr;
//then if you want to clean do :
delete (*obj_ptr_ptr);//to clean the class instance.
如果您只使用malloc或任何其他动态(堆)分配,为什么需要清除指针?但是,您可能在分配指针的堆栈上,因此不需要清除它。在其范围结束时,用于作用域中的堆栈内存会被清除。
你应该从底部开始,向上走。否则,你将失去对链式引用中下游数据引用的参考!
1. 删除两次取消引用后得到的数据,即*myPtrToPtr
2. 删除一次取消引用后得到的数据(指针),即myPtrToPtr
当然,只有在指针和它所指向的东西都是动态分配的情况下才这样做。
但我同意评论者的观点……更具体的信息会有助于我们理解上下文。
如果有内存泄漏,你必须先删除被引用的指针,然后再删除引用指针。一旦你删除了引用指针,访问被引用指针的存储将是未定义的行为,因为你刚刚销毁了该对象。
在考虑销毁指针之前,您首先需要定义每个指针的所有者。
如果您必须销毁指向您拥有的指针的指针,则需要先销毁引用的指针或在销毁另一个指针之前暂时保存其值。
但是,在进行猜测之前,您应该考虑使用类似于valgrind/purify或等效的内存检查工具,并考虑谁拥有什么(即:谁应该销毁谁)。