封裝對象並管理其生命週期的最佳方法是什麼?例如:我有一個類A,其中包含類型爲B的對象,並且是單獨負責的。封裝對象的生命週期管理
解決方案1 ,克隆b對象,以確保只有一個是能夠清理。
class A
{
B *b;
public:
A(B &b)
{
this->b = b.clone();
}
~A()
{
delete b; // safe
}
};
解決方案2,直接使用傳遞的對象,我們就可能一個潛在的雙重免費在這裏。
class A
{
B *b;
public:
A(B *b)
{
this->b = b;
}
~A()
{
delete b; // unsafe
}
};
在我的實際案例中,解決方案#2最適合。但是,我不知道這是否被認爲是不好的代碼,因爲即使有記錄,有人可能不知道A的行爲。我能想到這些場景:
B *myB = new B();
A *myA = new A(myB);
delete myB; // myA contains a wild pointer now
或者,
B *myB = new B();
A *firstA = new A(myB);
A *secondA = new A(myB); // bug! double assignment
delete firstA; // deletes myB, secondA contains a wild pointer now
delete secondA; // deletes myB again, double free
可我只是忽視這些問題,如果我正確記錄A的行爲?宣佈責任並讓其他人閱讀文檔就足夠了嗎?這是如何在你的代碼庫中管理的?
所以,你會改變A的構造函數採取類似shared_ptr包含b? – driAn 2009-01-12 20:24:47
不需要引用計數。如A所述,擁有所有權。 – 2009-01-12 20:37:39