例如,如果我有一個包含一個指向動態分配對象的對象,然後將其分配給用相同類型另一個目的,即如何避免兩次刪除分配的內存?
object2 = object1;
和析構函數會明確地刪除動態分配的對象。所以當object2和object1超出範圍時,會發生錯誤(我認爲這是因爲動態分配的對象的地址被刪除了兩次)。那麼我應該怎麼做才能解決/避免這個問題?
例如,如果我有一個包含一個指向動態分配對象的對象,然後將其分配給用相同類型另一個目的,即如何避免兩次刪除分配的內存?
object2 = object1;
和析構函數會明確地刪除動態分配的對象。所以當object2和object1超出範圍時,會發生錯誤(我認爲這是因爲動態分配的對象的地址被刪除了兩次)。那麼我應該怎麼做才能解決/避免這個問題?
我猜這是C++?在這種情況下,請看smart pointers。引用計數(boost :: shared_ptr)有助於解決這類問題。
你不能避免它,因爲你將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變量來告訴它是一個副本。但是,如果原始對象被刪除,則副本將無法使用,因爲它們將具有無效指針。