2013-03-13 31 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中找到。