2009-12-22 27 views
2

我正在使用HDF5將一個字符串讀入由new[]分配的char*。然後我使用string :: assign()調用將這些數據複製到我實際需要的位置。然後我在該char *上調用delete[]。這顯示爲使用totalview的內存泄漏源。它顯示在stdlibC++ delete[]replace_safe,mutate,create,然後malloc下的損壞的調用。這是怎麼回事,這真的是內存泄漏?我也在這裏設置了GLIBCXX_FORCE_NEW=1malloc調用刪除[]顯示爲內存泄漏總視圖

以下是複製情況的示例代碼。請注意valgrind顯示沒有泄漏,如果我沒有在cout調用之前放置斷點,則totalview沒有發現泄漏。

#include <string> 
#include <iostream> 
#include <cstdlib> 

int main() 
{ 
    std::string str; 

    int len = strlen(getenv("PATH")); 
    char* x = new char[len + 1]; 
    strcpy(x, getenv("PATH")); 
    x[len] = '\0'; 

    str.assign(x); 

    delete[] x; 

    std::cout << str << std::endl; 
} 
+0

通過Valgrind的運行這個程序不產生任何警告。 「總堆使用情況:2個分配,2個釋放,146個字節分配」 – 2009-12-22 21:43:40

+0

請問OP沒有說自己? – 2009-12-22 22:22:23

+1

難道你不能只是'str = getenv(「PATH」)'? – UncleBens 2009-12-22 23:13:50

回答

3

它應該是罰款:
但我會建議使用的std :: vector而不是newing字符數組:

std::vector<char> x(len+1); 
strcpy(&x[0], getenv("PATH")); 

我之所以會這樣是該方法分配( )可能會引發異常。因爲這樣的刪除可能不會被調用,因此在出現異常時可能會泄漏。由於RAII,使用您授予的載體將清除內存。

+0

+1。由於RAII的提及。 – paercebal 2009-12-22 21:59:32

+0

我建議使用std :: string而不是std :: vector,因爲OP使用的是char *而不是'unsigned char *'。 – 2009-12-22 22:21:17

+0

嗯...雖然你說的是完全有效的,它甚至試圖回答這個問題嗎? – 2009-12-22 22:21:41

2

不相關的泄漏,但如果你知道長度更喜歡strncpy超過strcpy

+0

請記住'strcpy'會複製所有的字符,直到它找到一個空終止字符,非法地址被擊中,或者世界結束。 – 2009-12-22 22:22:11

+0

'std :: string'的一個很好的特性是複製功能被內置和*測試*。 – 2009-12-22 22:23:13