使用c ++字符串时内存泄漏

时间:2013-03-13 15:59:53

标签: c++ valgrind

当我在下面的程序中运行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?

5 个答案:

答案 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