2011-03-22 104 views
4

我們如何使用重載操作符來防止C++中的內存泄漏?避免內存泄漏

任何完整的例子..

問候,

PKV

+1

那麼,我想你可能會超載一個操作員,導致您的系統關機或什麼。你有一個特定的情況? – Cameron 2011-03-22 05:39:29

+0

你的意思是使用重載的'operator new'? – Naveen 2011-03-22 05:42:41

回答

11

如果您想避免內存泄漏,請勿使用delete

這似乎有些矛盾,但事實是手動內存管理很容易出錯,所以最好使用自動(或庫)工藝。

在C++中,對於您創建的每個對象,都應該有明確的所有權。也就是說,你應該能夠識別對象的生命週期,可能取決於其他人。

的第一步是避免動態內存分配的:如果你不使用new,你沒有什麼管理 - 警告:一些圖書館將交出你的內存,並期望你釋放它。因此,只要有可能,使用堆棧

通過使用STL容器(例如std::vector<T>)可以避免許多使用new而不是滾動自己的情況。

第二步是謹慎使用new,並在分配後立即將內存交給單個所有者。這些股東包括:

  • std::unique_ptr(C++ 0x中)或boost::scoped_ptr,在不得已std::auto_ptr
  • boost::ptr_vectorBoost.Pointer Container

一個所有者的整個集合容易跟蹤下來,因爲對象的生存是依賴於它的主人,因此對象的生命週期是很容易追查了。

第三步是微妙的一個,引入共享所有權。它確實使得圍繞對象的生命週期的所有推理複雜化,並且引入了引用週期的風險,這有效地意味着內存泄漏。在某些情況下它們是必需的,但是儘可能避免。

  • std::shared_ptr(C++ 0X)或等效(std::tr1::shared_ptrboost::shared_ptr
  • std::weak_ptr(C++ 0X)或等效

後者是用來 「中斷」 週期。然而,即使有關係圖,它也可能很快變得難以理解在哪裏介紹weak_ptr

編輯:

正如託拜厄斯指出,這個成語就是所謂的資源獲取就是初始化(RAII),這是笨拙而得名。一個更新的術語正在出現:範圍綁定資源管理(SBRM)來描述它的一個子集 - >將資源綁定到範圍。

+0

Boost還提供了'make_shared'和'allocate_shared',它們可以避免使用'new'。 – 2011-03-22 07:52:10

+0

是的,儘管它仍然在使用'new'。 – 2011-03-22 07:56:38

+0

是的,但所有的STL容器都使用''new''。還應該指出的是'放置新'也可以安全使用而不會造成內存泄漏。 – 2011-03-22 08:09:50

1

如果你想避免內存泄漏不會推出自己的解決方案使用boost.shared_ptr。如果你真的想手動完成,那麼把你的清理代碼放在析構函數中。

+0

我想知道boost.smart_ptr是如何工作的... – pkvprakash 2011-04-09 06:33:37

2

只是爲了一些共性添加到Matthieus答案:

每當你使用需要被釋放的資源(內存,網絡連接,文件句柄,窗口句柄,...)使用Resource Acquisition Is Initialization (RAII)

這個習語的一個表現形式是上面提到的std :: unique_ptr和boost :: scoped_ptr。 如果您沒有可用的所需資源的RAII容器 - 建立一個。這總是值得的。

+0

Oups,我很專注,我忘了這個成語的名字:D – 2011-03-22 07:57:47

2

大多數人推薦使用Boost或STL,但有些情況下這是不可能的(操作系統開發,資源有限的嵌入式系統等)。在這種情況下,請確保儘可能使用堆棧,並且只在類的構造函數中使用new,在其desctructor中使用delete。對於雙重檢查,有一些工具可以幫助您查找內存泄漏,如valgrind

+0

valgrind for linux。如果你使用windows - 使用deleaker。 – 2011-12-27 21:40:03