2011-06-21 102 views
0

我有幾個通過指針共享數據的對象。指針參數通過構造函數發送,如下所示。通過C++中的指針共享對象之間的數據

class A 
{ 
public: 
    Shared* pB = new Shared(); 
    User* object1 = new User(pB); 
    User* object2 = new User(pB); 
} 

class User 
{ 
public: 
    User(Shared* pB) {m_sharedB = pB}; 
private: 
    Shared* m_sharedB; 
} 
class Shared 
{ 
public: 
    struct Account 
    { 
     int account_number; 
    } 
    void method(){...}; 
} 

我的問題與C++析構函數有關。當object1被刪除時,成員變量「m_sharedB」會發生什麼?其他同伴有沒有懸掛指針的問題?

+1

錯誤的數量。你真的嘗試過什麼嗎?請修復基本的語法錯誤。 –

+0

它是「共享」指針嗎?或者它是圖書館類? –

+0

m_sharedB指向的對象不會被刪除。永遠。我以某種方式認爲這不是你正在尋找的答案。也許你應該問的問題是如何在不再需要它之後立即銷燬該對象? – Dialecticus

回答

6

如果您有包含一個成員是一個指針類,

class Foo 
{ 
    Bar * mp_bar; 
}; 

然後在一個Foo對象的破壞,沒有任何反應除了指針,其包含的對象一起,超出範圍。這是同樣的形式出現在下面的功能到底發生了p

void bar() 
{ 
    int * p; 
} 

你可能意味着要問的是「發生了什麼對象,該指針指向」。這是一個完全不同的問題,答案是「沒有」。

(所以通常當你有一個包含你應該好好想想誰擁有這可能需要的任何資源認爲一個指針成員的類進行清理。)


既然你提到這個詞「析構函數」在你的問題中,讓我們一勞永逸:

指針類型對象沒有析構函數。當指針超出範圍時,有沒有自動調用delete

+0

@ user481034:那麼,當一個類型爲'Foo'的對象位於堆棧上並超出範圍時,它的成員對象也會去超出範圍並被解開。如果一個'Foo'對象已經被分配到堆上,那麼它的成員對象在'Foo'時被釋放。 –

+0

這個成員變量指針是否像堆棧上的本地或臨時變量一樣行爲,一旦函數返回,它們就從堆棧內存退出。另外,您是否建議指針所有者或創建者(即類A)應該刪除指針?那麼如果在非所有者,我,e,用戶類'dtor,m_shared被刪除? – newID

+0

@ user481034:這一般不能回答,這取決於你的設計。您必須考慮指針的來源以及它是否指向堆分配的資源。原則上是的,有人最終必須釋放內存。通常我們會在構造函數中分配內存管理類,並在析構函數中釋放內存,但是必須非常小心地複製這樣的對象。請參閱'shared_ptr'瞭解如何正確執行。然後使用'shared_ptr' ;-) –

0

當object1被刪除,存儲指向m_sharedB因爲你沒有提供的類用戶析構函數將被釋放。這將它留給包含類(類A)來管理Shared指針的生命週期,確保一旦沒有更多對它的引用存在,就可以正確刪除它(即共享相同Shared指針的所有User實例都是死)。

+0

_你還沒有提供析構函數._ 自動生成的desctructor怎麼樣? –

+0

自動生成的析構函數不會刪除指針。 –

0

當object1被刪除時,成員變量「m_sharedB」會發生什麼?

當object1被刪除時,沒有任何東西指向pB。但變量m_shared被銷燬。 另外我想建議你使用boost庫中的智能指針。特別是shared_ptr

+1

或std :: tr1 :: shared_ptr(如果可用)。 –

0

這聽起來像你的問題得到解答,但我只想提boost::shared_ptr。這可能無法滿足您當前的需求,但它是像上面描述的那樣有用的情況。