2013-03-13 32 views
1

当我在下面的程序上运行valgrind时,它报告内存泄漏。你能解释一下原因吗?使用C++字符串时的内存泄漏

#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

你不自由arr。 – Aneri 2013-03-13 16:00:44

+4

你为什么要写这个代码? @Aneri:你是海盗吗? ;-) – stefan 2013-03-13 16:02:04

+0

'std :: string'不会奇迹般地释放你的数组 – 2013-03-13 16:02:10

回答

5

valgrind是对的。您致电new,并且不要拨打delete,因此您有内存泄漏。

当您将arr指定为s时,后者不承担前者的所有权;相反,它会复制。您仍然有责任免费arr

1

delete arr在代码结束时会处理内存泄漏。

+0

你错了,没有'new []'来调用delete [] – kassak 2013-03-13 16:08:27

1

arr的所有权不会传递给s,它将arr复制到s的内部缓冲区。您应该释放内存delete操作

1

我认为你假定string将采取arr所有权,它是负责deletearr。但它是错误的。

string s = arr; 

只是复制从arr字符直至到达\0。所以,你自己应该是​​deletearr

0

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

有关该主题的更多信息可以在此C++ FAQ中找到。