2013-08-29 34 views
4

背景操作系統相關的C++內存泄漏?

我在我的代碼庫我的跨平臺運行庫ValgrindLinux下。我想看看這個就夠了,或者我應該太

問題

如果我的平臺獨立 C++代碼不上Linux泄漏(根據上WindowsMac運行動態代碼分析Valgrind),我是否可以假設它不會在WindowsMac上泄漏?如果不是,請提供一個不依賴於Linux(根據Valgrind)但在Windows和/或Mac(選擇「通用」編譯器,如VC++,GCC等編譯器)時泄漏的平臺無關C++示例。

精密(感謝意見和答案)

  1. 我很感興趣,獨立於平臺的C++代碼(所以沒有的#ifdef等);
  2. 我認爲我擁有C++代碼,而不是第三方代碼;
  3. 我認爲Valgrind是地面事實,但我可以考慮任何其他工具。我知道沒有工具可以檢測到所有內存泄漏。
+3

如果你有平臺相關的代碼或使用平臺相關的第三方庫,你應該在'Windows'和'Mac'上運行valgrind分析。即使編譯器依賴於平臺,也可能包含依賴於平臺的錯誤 - >運行valgrind。 – sebi

+0

確實!我編輯了我的問題,只專注於平臺無關的C++代碼。 – Korchkidu

+0

我只考慮MY C++代碼。不是第三方庫。 – Korchkidu

回答

3

您可以確定泛型代碼沒有泄漏,當然,如果您的應用程序體積適中,則很可能某些代碼是特定於Linux的,其他位特定於Windows,以及某些特定於Windows的代碼零件特定於OS X.

那些不是特定於Linux的部分當然不會被Valgrind測試。

所以,如果你有一定的一段代碼,做:

#if LINUX 
char buffer[512]; 
#else 
    char buffer = new buffer[2048]; 
#endif 
    ... use buffer ... 

,那麼你必須在Windows中的內存泄漏,但不是Linux。

很明顯,這是一個微不足道的例子,但是有時候類似的東西會潛入代碼中。

當然,在一個操作系統中使用某種系統調用的可能性是「安全的」,不能關閉或以其他方式「告訴操作系統您已完成」,然後在另一操作系統中出現問題。

而且,正如我以前指出的那樣,Valgrind的並不能保證你沒有問題,內存使用 - 它只能檢測喜歡的東西:

void func() 
{ 
    char *p = new [1700]; 
    ... 
    // no free of p; 
} 

void func() 
{ 
    char *p = new [1700]; 
    ... 
    // No free. 
    p = some_other_pointer; 
    ... 
} 

但不是:

void func() 
{ 
    vector<int> v; 
    for(;;) 
     v.push_back(1); 
} 

因爲內存仍然是「擁有」的東西。當然,這個特殊的例子是相當極端的,但是你可以在代碼存儲某些東西的時候有類似的東西,只是將越來越多的東西添加到存儲中,而不會刪除它們。

+0

我問過平臺無關代碼^^。查看我的編輯。此外,我精簡了「根據Valgrind。」 – Korchkidu

1

如果有條件編譯的代碼(例如#if defined (OS_LINUX)),那麼 你一定要確保其無滲漏爲每個平臺。

注意:這不是一個完整的答案,但只是我想到的一個案例。

+0

事實上,我沒有想到這一點。在這種情況下,C++代碼示例是微不足道的。我編輯了我的問題,只專注於平臺無關的C++代碼。 – Korchkidu

3

valgrind有助於發現缺陷,但不保證正確性。

您的代碼中仍然可能存在未定義的行爲,並且未定義的行爲可能在不同的平臺上以不同的方式表現出來,包括一個而不是另一個上的內存泄漏。

+0

事實上,這就是爲什麼我精簡「根據Valgrind」。 – Korchkidu