2013-05-03 54 views
2

我只是不小心寫下面的代碼。 它在linux環境下使用gcc 4.4.7進行編譯。C++新的運營商使用問題

int main() 
{ 
     new int; 
     return 0; 
} 

我很驚訝編譯器沒有指出任何錯誤或警告。 C++標準提到了這個嗎?在這種情況下是否仍有可能防止內存泄漏?任何建議是受歡迎的。

+4

沒有錯誤或警告信號,因爲這是完全有效的C++。不,你不能做任何有關泄漏的事情。 – Mat 2013-05-03 10:21:49

+0

@Mat:你應該做出答案而不是評論 – Skizz 2013-05-03 10:22:41

+0

問題是存在合法的內存泄漏。許多大型程序(例如GCC)在初始化時分配一些堆數據,並且不要打擾它。 – 2013-05-03 10:23:05

回答

1

這就是爲什麼您應該儘量避免在新代碼中儘可能使用原始「新」的原因之一。 std :: make_shared和C++ 14 std :: make_unique更安全,因爲它們將通過返回知道何時以及如何刪除對象的shared_ptr和unique_ptr對象來確保正確刪除內存。原意是,原始的新版本大多隻會在實現數據結構的低級代碼中需要。

1

這是沒有問題的。這在C++中是有效的。

+2

除了內存泄漏。 – john 2013-05-03 10:23:04

+2

不是所有的「泄漏」都是問題,@john。 – Mat 2013-05-03 10:24:24

+0

不,但是OP專門詢問了有關內存泄漏的問題,所以要簡單地說這沒有問題,而忽略了他的問題。 – john 2013-05-03 10:26:58

1

這是完全有效的C++。你爲什麼驚訝它編譯?

1

爲了防止內存泄漏,你應該使用,而不是原始指針的shared_ptr:

#include <memory> 
int main() 
{ 
     std::shared_ptr<int> i(new int); 
     return 0; 
} 

現在新分配的對象在範圍結束時刪除。你在代碼中沒有內存泄漏。有關更多詳細信息,請參閱C++的動態內存管理11 Dynamic Memory management

+2

除非您需要共享所有權或異常刪除,否則您應該使用更簡單的'unique_ptr',它的開銷不會超過普通指針。當然,如果對象的範圍是這樣的,那麼在沒有充分理由的情況下就不應該使用'new'。 – 2013-05-03 10:47:33

0

正如我所評論的,程序可以「合法」泄漏內存。

在大多數操作系統(特別是Posix或Linux)上,內核將在進程exits之後釋放進程使用的所有內存。因此,如果程序在其初始化期間分配一些(堆)數據(數量有限),並且根本不打算釋放它,則它是「合法的」內存泄漏(並且可能真正的程序表現出這種行爲:例如GCC編譯器或Firefox瀏覽器,或大多數X11客戶端庫等)。

但是,在程序的正常運行期間持續發生並且增加內存消耗的泄漏是不被接受的。

另外,我相信可以證明內存泄漏的靜態分析相當於halting problem,因此無法在編譯時始終檢測它:要麼你會得到一些false alarms,要麼會有一些泄漏留下來未被發現。

在運行時,您可以使用valgrind來追查內存泄漏。

此外,某些內存區域的活躍程度是該程序的全局屬性。閱讀更多關於garbage collection,或許可以考慮使用Boehm's conservative GC