我是C++的新手,發現在C++中,您有兩種方法可以創建一個對象:堆棧上的對象和堆上的對象。堆棧中的對象vs C++堆中的對象
但我很想知道在堆上使用對象與在堆上使用對象有什麼優缺點。
在什麼情況下,第一種方法優於第二種方法,反之亦然?
我是C++的新手,發現在C++中,您有兩種方法可以創建一個對象:堆棧上的對象和堆上的對象。堆棧中的對象vs C++堆中的對象
但我很想知道在堆上使用對象與在堆上使用對象有什麼優缺點。
在什麼情況下,第一種方法優於第二種方法,反之亦然?
對象具有該備份它們的存儲器被自動在該堆棧幀的端釋放的非常靈巧的屬性(例如,當函數返回。)C++延伸通過也要求所有堆棧析這個概念對象每當它們超出範圍(即在函數返回之前拋出異常的情況下它們仍然被釋放)。由於這使內存管理變得簡單,並且內存管理錯誤具有令人沮喪的組合,使得難以檢測,只要可行,堆疊分配應該是優選的。
堆棧分配對象的缺點是......好吧......它們在函數返回時被刪除。有時候有理由希望物體壽命更長。在這些情況下,你別無選擇,只能從堆中分配。
還有一點要考慮的是,堆棧分配非常必須是在軟件編譯時已知的大小(但看到ALLOCA功能可在一些平臺上。)有一噸的現實世界場景在程序運行多少內存你不需要知道的地方。以例如地址簿應用程序爲例。如果我正在編寫這樣一個應用程序,我顯然不知道最終用戶將在他們的地址簿中需要多少人。用戶必須告訴程序該信息。在這種情況下,你需要有動態分配的內存,所以你再次考慮堆分配。
請不要傳播神話。 –
堆棧幾乎總是可取的。您的對象可能會在堆上管理數據,例如std::string
,在這種情況下,對象本身會保留在堆棧上(與任何其他本地變量一樣),並且字符串數據位於堆上。
堆棧很快。堆很慢。 堆棧適用於小數據。堆是用於大數據的。
希望這會有所幫助。在堆棧上
那麼,如果對象的生命週期必須超過創建它的函數的生命週期,並且它不能被複制或移動,它並不是真正重要的。 –
任何對象都是如此,簡單或複合。 –
請不要傳播神話。 –
重複http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap和http://stackoverflow.com/questions/10157122/object-creation-on堆棧堆?rq = 1和http://stackoverflow.com/questions/8781997/pointers-to-objects-in-c-whats-on-the-stack-heap?rq=1 *和* http ://stackoverflow.com/questions/5836309/stack-memory-vs-heap-memory RQ = 1。 – refi64
@Vishlesh Patel也有靜態存儲持續時間的對象。我認爲你的問題太寬泛了。:) –
問題是太功課了。 –