2009-12-22 52 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