在C ++中,如果将指针传递给指向方法的指针,是否首先删除引用的指针?你需要在方法中清理它吗?我正在检查任务管理器中的内存,它正在泄漏!
谢谢!
答案 0 :(得分:7)
删除指向指针的指针:
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
}
答案 1 :(得分:3)
“指向指针的指针”?
例如,如果您有:
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 ...或任何其他动态(堆)分配。 但是你可能在堆栈上分配了指针,所以你不需要清理它。在他的范围的末尾,清理范围中使用的堆栈上的内存。
答案 2 :(得分:0)
你应该从底部开始,然后上去。否则,您将失去对引用链下方数据引用的引用!
<强> 1。通过解除引用两次删除您获得的数据,即*myPtrToPtr
<强> 2。通过解除引用一次删除您获得的数据(指针),即myPtrToPtr
但是,当然,只有当指针和指向它的东西都被动态分配时才这样做。
我同意评论者的意见......更具体的说明会对我们提供一些背景信息。
答案 3 :(得分:0)
如果它正在泄漏,则必须先删除引用的指针,然后删除引用指针。删除引用指针后,访问引用指针的存储将是未定义的行为,因为您刚刚销毁了该对象。
答案 4 :(得分:0)
在考虑销毁每个指针之前,首先需要定义谁是每个指针的所有者。
如果你必须销毁一个指向你所拥有的指针的指针,那么你需要先破坏引用的指针,或者在销毁另一个之前暂时保存它的值。
但你应该考虑使用像valgrind / purify或类似的内存检查工具,并在做出疯狂猜测之前考虑谁拥有什么(即:谁应该摧毁谁)。