2010-10-06 96 views
4

在C++中,如果將指針傳遞給方法,是否首先刪除引用的指針?你需要在方法中清理它嗎?我正在檢查任務管理器中的內存,它正在泄漏!如何刪除指針指針?

謝謝!

+4

一個具體的例子會有幫助。 – 2010-10-06 18:42:04

回答

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 
} 
+0

謝謝!我需要刪除方法內的引用指針,因爲它不再需要在方法外部使用。 – Moderator71 2010-10-06 18:58:58

+2

使用C++很多時候傳遞RAW指針似乎很奇怪。 – 2010-10-06 19:57:57

0

你應該從底層做起,去了。否則,您將失去對引用鏈中數據引用的引用!

1.刪除您提領兩次獲得數據,即*myPtrToPtr

2.刪除您提領一次得到(指針)的數據,即myPtrToPtr

當然不過,只有在指針和它指向的東西都被動態分配的情況下才這樣做。

通過我與評論者同意...是更具體的將是有益的給我們一些背景。

0

如果漏水,必須先刪除引用指針,然後刪除引用指針。一旦刪除引用指針,訪問引用指針的存儲將是未定義的行爲,因爲您剛剛銷燬了該對象。

0

您首先需要定義誰是每個指針的所有者,然後再考慮銷燬它。

如果你必須摧毀它指向你自己的一個指針的指針,那麼你需要或者先破壞引用指針或破壞其他人之前暫時保存其價值。

但你應該考慮使用內存檢查像Valgrind的工具/淨化或同等學歷,想想是誰擁有什麼:做胡亂猜測之前(即誰應該破壞誰)。

3

「A指針的指針」?

如果您爲例有:

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 ......或任何其他動態(堆)只分配。 但它可能在堆棧上分配了指針,因此不需要清除它。在作用域結束時,在作用域中使用的堆棧上的內存被清除。