避免內存泄漏
回答
如果您想避免內存泄漏,請勿使用delete
。
這似乎有些矛盾,但事實是手動內存管理很容易出錯,所以最好使用自動(或庫)工藝。
在C++中,對於您創建的每個對象,都應該有明確的所有權。也就是說,你應該能夠識別對象的生命週期,可能取決於其他人。
的第一步是避免動態內存分配的:如果你不使用new
,你沒有什麼管理 - 警告:一些圖書館將交出你的內存,並期望你釋放它。因此,只要有可能,使用堆棧。
通過使用STL容器(例如std::vector<T>
)可以避免許多使用new
而不是滾動自己的情況。
第二步是謹慎使用new
,並在分配後立即將內存交給單個所有者。這些股東包括:
std::unique_ptr
(C++ 0x中)或boost::scoped_ptr
,在不得已std::auto_ptr
。boost::ptr_vector
和Boost.Pointer Container庫
一個所有者的整個集合容易跟蹤下來,因爲對象的生存是依賴於它的主人,因此對象的生命週期是很容易追查了。
第三步是微妙的一個,引入共享所有權。它確實使得圍繞對象的生命週期的所有推理複雜化,並且引入了引用週期的風險,這有效地意味着內存泄漏。在某些情況下它們是必需的,但是儘可能避免。
std::shared_ptr
(C++ 0X)或等效(std::tr1::shared_ptr
,boost::shared_ptr
)std::weak_ptr
(C++ 0X)或等效
後者是用來 「中斷」 週期。然而,即使有關係圖,它也可能很快變得難以理解在哪裏介紹weak_ptr
。
編輯:
正如託拜厄斯指出,這個成語就是所謂的資源獲取就是初始化(RAII),這是笨拙而得名。一個更新的術語正在出現:範圍綁定資源管理(SBRM)來描述它的一個子集 - >將資源綁定到範圍。
Boost還提供了'make_shared'和'allocate_shared',它們可以避免使用'new'。 – 2011-03-22 07:52:10
是的,儘管它仍然在使用'new'。 – 2011-03-22 07:56:38
是的,但所有的STL容器都使用''new''。還應該指出的是'放置新'也可以安全使用而不會造成內存泄漏。 – 2011-03-22 08:09:50
如果你想避免內存泄漏不會推出自己的解決方案使用boost.shared_ptr。如果你真的想手動完成,那麼把你的清理代碼放在析構函數中。
我想知道boost.smart_ptr是如何工作的... – pkvprakash 2011-04-09 06:33:37
只是爲了一些共性添加到Matthieus答案:
每當你使用需要被釋放的資源(內存,網絡連接,文件句柄,窗口句柄,...)使用Resource Acquisition Is Initialization (RAII)。
這個習語的一個表現形式是上面提到的std :: unique_ptr和boost :: scoped_ptr。 如果您沒有可用的所需資源的RAII容器 - 建立一個。這總是值得的。
Oups,我很專注,我忘了這個成語的名字:D – 2011-03-22 07:57:47
大多數人推薦使用Boost或STL,但有些情況下這是不可能的(操作系統開發,資源有限的嵌入式系統等)。在這種情況下,請確保儘可能使用堆棧,並且只在類的構造函數中使用new
,在其desctructor中使用delete
。對於雙重檢查,有一些工具可以幫助您查找內存泄漏,如valgrind
。
valgrind for linux。如果你使用windows - 使用deleaker。 – 2011-12-27 21:40:03
- 1. 避免內存泄漏。 (WeakReference)
- 2. 避免內存泄漏
- 3. FLEX:避免內存泄漏
- 4. 避免dojo內存泄漏?
- 5. 避免內存泄漏
- 6. 如何避免共享內存泄漏
- 7. 避免事件內存泄漏
- 8. 避免JNI C中Java內存泄漏
- 9. 避免內存泄漏的好方法
- 10. 避免C++中的內存泄漏?
- 11. boost :: asio acceptor避免內存泄漏
- 12. 如何避免字節[]內存泄漏?
- 13. 爲了避免內存泄漏
- 14. 避免內存泄漏倒計時
- 15. 如何避免內存泄漏?
- 16. 避免回調中的內存泄漏?
- 17. 避免異步超時內存泄漏
- 18. 內存泄漏C免費()
- 19. 用__弱點避免泄漏
- 20. 如何避免應用程序中存在內存泄漏?
- 21. Android - 避免從圖庫中提取圖像的內存泄漏
- 22. 如何避免.net 3.5上WPF上的大量內存泄漏?
- 23. 如何在獲取UIImageView時避免此內存泄漏?
- 24. 如何避免dijits引起的內存泄漏?
- 25. 內存泄漏是不可避免的在C
- 26. Android - 良好的做法,以避免內存泄漏
- 27. 是dequeueReusableCellWithIdentifier強制性的以避免內存泄漏?
- 28. 當屬性分配兩次時避免內存泄漏
- 29. Tomcat的停止線,以避免潛在的內存泄漏
- 30. 刪除監聽器,以避免內存泄漏
那麼,我想你可能會超載一個操作員,導致您的系統關機或什麼。你有一個特定的情況? – Cameron 2011-03-22 05:39:29
你的意思是使用重載的'operator new'? – Naveen 2011-03-22 05:42:41