Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ delete[]在totalview中显示为内存泄漏时的Malloc调用_C++_Memory Leaks_Malloc_Delete Operator_Totalview - Fatal编程技术网

C++ delete[]在totalview中显示为内存泄漏时的Malloc调用

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

我正在使用HDF5将一个字符串读入由
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
的一个好功能是内置并测试复制功能。