2012-09-29 23 views
0

可能重複:
how to safely delete multiple pointers如何刪除超過1個指針指向同一個地址

如下面的代碼:

#include <iostream> 
using namespace std; 

int main(int argc, _TCHAR* argv[]) 
{ 
    int *p, *q; 
    q = new int; 
    p = q; 
    delete q; 
    q = NULL; 
    cout << p << " " <<q << endl; 
    return 0; 
} 

pq。當我刪除qq = NULL時,p仍然指向舊地址。 有沒有人有辦法讓p自動指向qNULL? 因爲如果在程序中有很多指向相同地址的指針,我們不能讓它們指向NULL它會帶來問題。

+0

好吧,指向變量的指針只是指向變量的兩個指針,所以你必須手動完成。或者嘗試將它作爲一個數組,在那裏你有p [2],然後有兩個單獨的poiinters,然後通過遍歷數組來刪除它們。 – Annabelle

+1

因此,與std :: shared_ptr不同,最後一個引用最終釋放貨物,所以您希望對象(和本例中的int)知道對它的所有引用,並清除它們* all * *其中任何*都是free'd ? – WhozCraig

+0

不能把'p'作爲參考嗎? http://ideone.com/ahFmH – chris

回答

4

有一種智能指針可以完成這項工作。此代碼可能存在線程安全問題,(實際上我保證會有)。

template <class T> 
class DoublyLinkedSmartPointer 
{ 
    public: 
     DoublyLinkedSmartPointer(const DoublyLinkedSmartPointer &other); 
     DoublyLinkedSmartPointer& operator=(const DoublyLinkedSmartPointer& other); 
     virtual ~DoubleLinkedSmartPointer(); 
     T * operator*(); 
     const T* operator*() const; 

     void freeAll(); 
    private: 

     DoublyLinkedSmartPointer *next, *previous; 
     T * data; 
} 

的基本思路是,每當一份拷貝的智能指針,你加進副本使用用於初始化它的智能指針的 列表。當你刪除指針時,你從列表中釋放它。

現在,棘手的一點,因爲每個指針都知道每一個其他指針,所以您可以從任意一點遍歷列表,並在每個節點中將數據設置爲NULL。

好的,這就是你如何做到的。但更重要的是,不要這樣做。你幾乎肯定會創建難以維護的代碼,並且幾乎無法調試。最好的內存管理策略是最簡單的。

1

C++程序的一般建議是避免基本的指針,正是爲了避免你遇到的問題。相反,使用的語言(或更精確的標準庫)的方法來處理指針:

1使用的容器,如std::vector,而不是指向堆上

2利用分配(大塊)內存std::unique_ptrstd::shared_ptr(和std::weak_ptr)來管理在堆上分配的對象。這隻適用於C++ 11及其移動語義,請參閱標準頭文件。

優點:自動解除分配而不留下懸掛指針;異常安全(拋出異常和堆棧倒回不會泄漏內存)。