2013-07-17 74 views
2

我有下面的代碼:動態分配的字符串數組沒有被釋放

string * p = new string[8]; 
cout<<sizeof(p)<<endl; 
free(p); 

這似乎確定我,但與失敗:

8 
a.out(85837) malloc: *** error for object 0x7fb5b3403ae8: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

的整數陣列中的其他測試工作。有什麼特別的C++字符串?

+4

沒有通讀該指南的整章內容?不好。 – 2013-07-17 22:39:51

+0

@KerrekSB已收藏。 – 2013-07-17 22:47:54

+8

您拼寫了'std :: vector (8)'錯誤。 – Casey

回答

11

Y。 new []配對delete []free() ing導致未定義的行爲。

+0

啊,我的不好。它似乎免費配對新的內置類型。 –

+9

@HaliangZhang不,它沒有。 'new'與'delete','new []'與''''''和'malloc()','calloc()'和'realloc()'與'free()'配對。任何其他組合都是錯誤的。 – 2013-07-17 22:40:45

+2

另外,從你的代碼中,在我看來,你期望'sizeof'運算符產生8個。它可能不會(除非你有足夠的幸運來使用64位系統)。 [這是爲什麼。](http://c-faq.com/aryptr/index.html) – 2013-07-17 22:46:04

12

首先,當您使用new時,您需要使用delete而不是free()。事實上,你絕對不應該在C++中使用free()malloc()。爲什麼你不應該混newfreemalloc()和刪除一個很好的解釋是newdelete調用構造函數和析構函數,free()malloc()什麼都沒有做,他們只是分配和釋放內存,特別是對於內置類此是不好的,因爲你不知道std::string的析構函數或構造函數應該發生什麼,所以可能使它與你自己的內置類一起工作(但不要這樣做)。

你可以用這個代替代碼:

string * p = new string[8]; 
cout<<sizeof(p)<<endl; 
delete [] p; 

最後,我建議你使用一個內置的數據類型一樣std::vectorstd::array。它們比標準的舊C數組多得多。

相關問題