But there is no f any more in that case.
好了,指針f
超出範圍,這是事實,但我們的指針仍返回同一對象f
指向。
因此,我們仍然有該對象的句柄,我們仍然可以在返回的指針上調用delete
。實際上,在創建一個包含new
的對象後,您可以在任何時候調用delete
。
你要照顧那是什麼:
- 你確實在某些時候與
new
(否則你有內存泄漏)分配的每個對象調用delete
;
- 您不會爲同一個對象多次調用
delete
,否則會得到未定義的行爲;
- 您不要取消引用指向已銷燬對象的指針(即「懸掛指針」),否則您會得到未定義的行爲。
通常,手工存儲器管理通過new
和delete
不鼓勵在現代C++,和所有權政策應通過智能指針代替來實現。 OR ...
In the four method below, only better is what we should do
不完全。實際上,我會說我們絕對不應該這樣做better()
- 雖然我們可能做一個版本better()
修改爲創建和返回一個智能指針,而不是一個擁有原始指針。
然而,功能mediocre()
其實是相當不錯的,這是出於兩個原因:
- 首先,因爲它很可能編譯器會的Elid調用拷貝構造函數和執行(Named) Return Value optimization,從而導致沒有運行時間開銷;
- 其次,正是因爲有了C++ 11的移動語義,有可能 裝備
Foo
與轉移構造使得由值 效率在大多數情況下,即使不進行省音返回。
此外,由於Zoidberg正確地在評論中提到,如果你不真的需要它們,你就不應該使用指針。通過創建具有自動存儲持續時間的對象(又名「在堆棧中」)可以實現獨特的所有權,並且移動語義使得這種做法高效。應該只創建指針when you need reference semantics。
把它放入一個智能指針並返回,以使「更好」的工作更好。 – chris
「平庸」實際上是最好的,只是說。參見[_Modern C++ Style_](http://klmr.me/slides/modern-cpp/#1)。另請參閱Bjarne Stroustrup討論移動語義的[_C++ 11 Style_](http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style)。 – 2013-03-30 00:44:38
你基本上在問:「我如何做記憶管理」,這是一個令人難以置信的廣泛而主觀的話題。 – Antimony