2010-08-23 41 views
1

例如,如果我有一個包含一個指向動態分配對象的對象,然後將其分配給用相同類型另一個目的,即如何避免兩次刪除分配的內存?

object2 = object1; 

和析構函數會明確地刪除動態分配的對象。所以當object2和object1超出範圍時,會發生錯誤(我認爲這是因爲動態分配的對象的地址被刪除了兩次)。那麼我應該怎麼做才能解決/避免這個問題?

回答

0

我猜這是C++?在這種情況下,請看smart pointers。引用計數(boost :: shared_ptr)有助於解決這類問題。

0

你不能避免它,因爲你將object1的所有位複製到object2,會有兩個指向同一位置的指針,但析構函數會被調用兩次,因爲有兩個對象。

最前一頁解決方案將防止對象2的析構函數的調用:

char object2_data[sizeof(object1)]; 
Type* object2 = (Type*) object2_data; 
*object2 = object1; 
... 
object1.do_something(); 
object2->do_something(); //However, the pointer is different 

第二種方法是重新設計的對象,並添加一個布爾變量,如果對象是一個副本會告訴我們。當對象被刪除時,如果它是一個副本,請不要刪除指針。最後,實現複製構造函數並重載operator =來複制對象並設置bool變量來告訴它是一個副本。但是,如果原始對象被刪除,則副本將無法使用,因爲它們將具有無效指針。