回答
你只能做如果更換由obj
有一個新的對象指向按照被破壞的對象:
auto obj = new Object;
obj->~Object();
new (obj) Object();
delete obj;
否則,調用未定義的行爲。
您應該明白:
new
電話operator new
獲得內存,然後調用提供construtor創建對象delete
調用對象的析構函數,然後調用operator delete
來「返回」內存。
編輯:博佩爾鬆指出的那樣,它不是,如果你不能提供異常的好主意保證
如果*成功*替換該對象。如果構造函數拋出,你仍然敬酒。 –
如果有必要在釋放內存之前發生對象的破壞,是否有任何告訴C++的方式「該指針標識已被破壞但尚未刪除的對象所使用的已分配存儲空間;請釋放存儲空間調用析構函數「? – supercat
@超級貓,是的......但它需要更多的工作。雖然你可以在指針上顯式調用operator delete(obj),但在有[* class-specific *'operator delete']的情況下會失敗(http://en.cppreference.com/w/cpp /存儲器/新/ operator_delete#類specific_overloads)。當'delete' *表達式*調用'操作符delete(...)'時,標準要求它首先檢查*特定類*的重載。但是當你在你的代碼中明確地調用'operator delete'時,這[不會發生](http://coliru.stacked-crooked.com/a/7e4c76a444a8d8cf)。 – WhiZTiM
它是未定義行爲造成的對象析構函數被調用兩次。你沒有遵循規則,編譯器可以隨你的代碼做任何事情。只需不要那樣做。
如果我們嚴格遵守標準語言,您的代碼會導致未定義的行爲,並會導致問題。
不過,我會很驚訝,如果任何平臺將遇到任何問題,以下內容:
struct Foo {};
void testFoo()
{
Foo* foo = new Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
delete foo;
}
在另一方面,我會很驚訝,如果任何平臺都可以執行以下,而不會在問題。
struct Bar {std::string s;};
void testBar()
{
Bar* bar = new Bar{"test"};
bar->~Bar();
delete bar;
}
- 1. 手動調用析構函數後如何刪除內存?
- 2. 刪除析構函數調用內
- 3. 是否刪除[]調用析構函數?
- 4. 我可以防止在重載刪除之前調用析構函數嗎?
- 5. 刪除調用析構函數但不刪除對象?
- 6. 基地析構函數之前調用析構函數派生導致問題
- 7. 刪除[]析構函數
- 8. C + +構造函數/析構函數調用&動態創建的數據調用「新」刪除舊數據?
- 9. 析構函數立即調用並刪除我的數組
- 10. viewDidLoad在構造函數之前調用
- 11. C++:析構函數在超出範圍之前被調用?
- 12. 是什麼在C++中刪除,並調用析構函數之間的區別
- 13. 在父構造函數之前調用子類構造函數
- 14. SpiderMonkey:手動調用構造函數
- 15. 手動對象構造函數調用
- 16. 在刪除時調用構造函數?
- 17. 會刪除這個調用析構函數嗎?
- 18. std :: list.remove調用析構函數但不刪除它
- 19. C++析構函數調用刪除操作符?
- 20. Maya:刪除節點不直接調用析構函數
- 21. 析構函數刪除主動聲明的動態數組
- 22. 在刪除Windows之前調用一個函數
- 23. 在調用自定義函數之前刪除類名?
- 24. 在析構函數中刪除IBuffers
- 25. C++ /析構函數 - 運營商刪除
- 26. 如何刪除QCoreApplication析構函數
- 27. 刪除這個&私人析構函數
- 28. 標量刪除析構函數
- 29. 析構函數是否自動調用
- 30. 使用析構函數刪除動態對象? C++
萬一它不完全是顯而易見WhiZTiM的答案,爲什麼它的不確定的原因是因爲它會調用*爲連續同一物體的兩個*析構函數。 – HolyBlackCat