C++ delete[]在totalview中显示为内存泄漏时的Malloc调用
我正在使用HDF5将一个字符串读入由C++ delete[]在totalview中显示为内存泄漏时的Malloc调用,c++,memory-leaks,malloc,delete-operator,totalview,C++,Memory Leaks,Malloc,Delete Operator,Totalview,我正在使用HDF5将一个字符串读入由new[]分配的char*中。然后我使用string::assign()调用将此数据复制到实际需要的位置。然后我对该字符*调用delete[]。这是使用totalview显示的内存泄漏源。它显示stdlibc++中delete[]到replace\u safe,mutate,create,然后malloc下的损坏调用。发生了什么,这真的是内存泄漏吗?我在这里也设置了GLIBCXX\u FORCE\u NEW=1 下面是复制这种情况的示例代码。请注意,valgr
new[]
分配的char*
中。然后我使用string::assign()调用将此数据复制到实际需要的位置。然后我对该字符*调用delete[]
。这是使用totalview显示的内存泄漏源。它显示stdlibc++中delete[]
到replace\u safe
,mutate
,create
,然后malloc
下的损坏调用。发生了什么,这真的是内存泄漏吗?我在这里也设置了GLIBCXX\u FORCE\u 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;
}
#包括
#包括
#包括
int main()
{
std::字符串str;
int len=strlen(getenv(“路径”);
char*x=新字符[len+1];
strcpy(x,getenv(“路径”));
x[len]='\0';
str.assign(x);
删除[]x;
std::cout应该很好:
但我建议使用std::vector,而不是新建字符数组:
std::vector<char> x(len+1);
strcpy(&x[0], getenv("PATH"));
std::向量x(len+1);
strcpy(&x[0],getenv(“路径”));
我这样做的原因是方法assign()可能会引发异常。因此,可能不会调用delete,因此在出现异常时可能会泄漏。使用您授予的向量,内存会因为RAII而被清除。与泄漏无关,但如果您知道长度,则更喜欢strncpy
而不是strcpy
通过valg运行此程序rind不产生任何警告。“总堆使用率:2个alloc,2个free,分配了146个字节”威尔,OP自己不是这么说的吗?难道你不能只做str=getenv(“PATH”)
?在实际的代码中,有一个read调用需要一个char*作为目标。我建议使用std::string而不是std::vector,因为OP使用的是char*
,而不是unsigned char*
。嗯……虽然你说的完全正确,但它甚至试图回答这个问题吗?@Michael:你是认真的吗?它明确地回答了回答第一句中的问题。@Thomas:该字符串是vector的替代品。但我使用的是char(不是无符号char)。此外,当我们将字符串用作缓冲区时,字符串还暗示了更多关于数据的信息。此外,在标准的当前版本中,也不能保证字符串具有连续存储(虽然它可能是隐含的,并在下一个标准中明确规定)。马丁,确实如此。但我认为OP需要解释(老实说,我不知道,也没有足够的兴趣去发现)。请记住,strcpy
将复制所有字符,直到找到空的终止字符、命中非法地址或世界结束。std::string
的一个好功能是内置并测试复制功能。