2013-01-05 51 views
0

我開始自學C++,如何在沒有垃圾回收器的情況下處理對象正在引起一些混淆。這裏是我正在嘗試做的一個簡單的例子:確保C++對象正確解除分配

A* a; 
B b = new B(a); // Note that B is a derived class of A 
a = &b; 

while (a != NULL) 
{ 
    (*a).run(); 
} 

這一切都按我期望的那樣工作。當我遇到的問題是,B的run()方法裏面,我想要做的事,如:

C c = new C(a); // a is the same pointer as above, that has been stored 
       // and C another derived class from A 
a = &c; 

,然後讓run()中退出。然後,第一個塊中的while循環會調用新對象的run()。我的問題是,如何確保原始b的內存被正確解除分配?

+0

你不需要通過'new'分配的一切。這是完全正確的(並且實際上更可取),就像這樣聲明變量:'B b;'或'C c;'。如果對象需要存在於其當前作用域之外,請使用[智能指針](http://stackoverflow.com/questions/395123/raii-and-smart-pointers-in-c)。 –

+0

大部分上述代碼未能編譯。在C++中,對象和指向對象的指針是不一樣的。 – Yakk

+0

我發現我極大地過分強調了我想要做的事情。我只是讓run()返回類型A,並且完全避免指針。考慮到我關於重新分配的問題,答案很有見地。 @Yakk,錯誤是什麼? –

回答

1

在這種情況下,您可以使用std::shared_ptr。如果兩個類有成員需要指向同一個對象,那麼你可以讓他們兩個都是shared_ptr。而且你通常這樣做,但是如果這樣做,如果你要創建循環依賴,那麼要打破循環依賴,你需要std::weak_ptr

這裏是std::shared_ptrstd::weak_ptr的例子。

錯誤的代碼(循環依賴):

struct B; 

struct A 
{ 
    std::shared_ptr<B> bp; 
} 

struct B 
{ 
    std::shared_ptr<A> ba; //this creates a cyclic dependency. 
} 

正確的代碼(非循環):

struct B; 

struct A 
{ 
    std::shared_ptr<B> bp; 
} 

struct B 
{ 
    std::weak_ptr<A> ba; //break cyclic dependency with std::weak_ptr 
} 
1

無論您何時遇到動態內存分配和非平凡所有權語義,智能指針通常都是確保正確性的好方法。例如,std::shared_ptr