2

我正在使用 HDF5 将字符串读入char*分配的new[]. 然后我使用 string::assign() 调用将此数据复制到我真正想要的位置。然后我调用delete[]那个 char*。这显示为使用 totalview 的内存泄漏的来源。它显示了 stdlibc++ 中delete[]to replace_safemutatecreate、 then下的错误调用malloc。发生了什么事,这真的是内存泄漏吗?我也设置GLIBCXX_FORCE_NEW=1在这里。

这是复制这种情况的示例代码。请注意,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;
}
4

2 回答 2

3

应该没问题:
但我建议使用 std::vector 而不是新建一个 char 数组:

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

我这样做的原因是方法 assign() 可能会引发异常。因此,删除可能不会被调用,因此您可能会在出现异常时泄漏。使用您授予的向量,由于 RAII,内存被清理。

于 2009-12-22T21:31:56.003 回答
2

与泄漏无关,但如果您知道长度更strncpy喜欢strcpy

于 2009-12-22T21:39:41.073 回答