1

当我在下面的程序上运行 valgrind 时,它会报告内存泄漏。你能解释一下原因吗?

#include <string>
#include <iostream>

using namespace std;

int main()
{
    char * arr = (char *) ::operator new(sizeof(char));
    string s = arr;

    return 0;
}
  1. 行字符串 s = arr 上到底发生了什么?它会复制 arr 吗?
4

5 回答 5

5

valgrind是正确的。你打电话new又不打电话delete,因此你有内存泄漏。

当您分配arr给 时s,后者不拥有前者的所有权;相反,它会复制。释放 仍然 是 你 的 责任arr.

于 2013-03-13T16:01:43.710 回答
1

delete arr在您的代码末尾将处理内存泄漏。

于 2013-03-13T16:01:41.180 回答
1

的所有权arr不会传递给s,它会复制arrs的内部缓冲区。delete您应该使用运算符释放内存

于 2013-03-13T16:02:54.047 回答
1

我认为您假设stringarr拥有delete. arr但这是错误的。

string s = arr;

只需复制字符,arr直到到达\0。所以,你应该delete arr自己。

于 2013-03-13T16:03:39.433 回答
0

new[]C++ 中的运算符动态分配内存。所有这些内存都必须由程序员手动释放。这是由delete[]操作员完成的。如果您不删除使用 new 分配的内存,则会造成内存泄漏。

关于该主题的更多信息可以在这个C++ FAQ中找到。

于 2013-03-13T16:08:01.363 回答