我正在使用 HDF5 将字符串读入由 new[]
分配的 char*
中。然后,我使用 string::assign() 调用将此数据复制到我真正想要的位置。然后我对该 char* 调用 delete[]
。这显示为使用 TotalView 的内存泄漏的根源。它显示了 stdlibc++ 中 delete[]
下对 replace_safe
、mutate
、create
和 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;
}
最佳答案
应该没问题:
但我建议使用 std::vector 而不是新建 char 数组:
std::vector<char> x(len+1);
strcpy(&x[0], getenv("PATH"));
我这样做的原因是方法 allocate() 可能会抛出异常。因此,可能不会调用删除,因此在出现异常时可能会泄漏。使用您授予的 vector ,由于 RAII 的原因,内存会被清理。
关于c++ - 对 delete[] 的 Malloc 调用在 TotalView 中显示为内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1949237/