当我在下面的程序中运行valgrind时,它会报告内存泄漏。你能解释一下原因吗?
#include <string>
#include <iostream>
using namespace std;
int main()
{
char * arr = (char *) ::operator new(sizeof(char));
string s = arr;
return 0;
}
答案 0 :(得分:5)
valgrind
是对的。你打电话给new
而不打电话给delete
,因此你有内存泄漏。
当您将arr
分配给s
时,后者不会取得前者的所有权;相反,它制作副本。免费arr
仍然是您的责任。
答案 1 :(得分:1)
delete arr
将处理内存泄漏。
答案 2 :(得分:1)
arr
的所有权未传递给s
,它会将arr
复制到s
的内部缓冲区。您应该使用delete
运算符
答案 3 :(得分:1)
我认为您认为string
将取得arr
的所有权,并且delete
负责arr
。但它错了。
string s = arr;
只需将arr
中的字符复制到\0
即可。因此,您应delete
arr
自己。
答案 4 :(得分:0)
C ++中的 new[]
运算符动态分配内存。所有这些内存必须由程序员手动释放。这是通过 delete[]
运算符完成的。如果不删除使用new分配的内存,则表明存在内存泄漏。
有关该主题的更多信息,请参阅此C++ FAQ。