当我在下面的程序上运行 valgrind 时,它会报告内存泄漏。你能解释一下原因吗?
#include <string>
#include <iostream>
using namespace std;
int main()
{
char * arr = (char *) ::operator new(sizeof(char));
string s = arr;
return 0;
}
- 行字符串 s = arr 上到底发生了什么?它会复制 arr 吗?
valgrind
是正确的。你打电话new
又不打电话delete
,因此你有内存泄漏。
当您分配arr
给 时s
,后者不拥有前者的所有权;相反,它会复制。释放 仍然 是 你 的 责任arr
.
delete arr
在您的代码末尾将处理内存泄漏。
的所有权arr
不会传递给s
,它会复制arr
到s
的内部缓冲区。delete
您应该使用运算符释放内存
我认为您假设string
将arr
拥有delete
. arr
但这是错误的。
string s = arr;
只需复制字符,arr
直到到达\0
。所以,你应该delete
arr
自己。
new[]
C++ 中的运算符动态分配内存。所有这些内存都必须由程序员手动释放。这是由delete[]
操作员完成的。如果您不删除使用 new 分配的内存,则会造成内存泄漏。
关于该主题的更多信息可以在这个C++ FAQ中找到。