2010-12-21 101 views
0

我初始化一個指向字符串類型的指針,並用malloc函數分配一些內存。我的問題是,當我嘗試使用這個指針指向的字符串之一,我得到分段錯誤。C++指向字符串類型分段錯誤的指針

string anyString = "anyWords"; 
string *pointerToString; 
pointerToString = (string *) malloc(sizeof(string) * 5); 
pointerToString[i] = anyString; // this line causes segmentation fault 

在此先感謝您的幫助。

+0

'我'的價值是什麼? – 2010-12-21 14:55:34

+2

你應該扔掉任何源頭教你在這裏使用malloc。 – 2010-12-21 15:05:53

回答

4

避免使用malloc與C++的對象。

相反,使用new

std::string * str = new std::string("Hello"); 
// ... 
delete str; 

對於數組:

std::string * tab = new std::string[5]; 
// ... 
delete[] tab; // if you allocated with new[], release with delete[] 

它的失敗在這種情況的原因是malloc,不像new,不會調用類的構造函數。由於std::string自己分配內存,所以最終會得到一個無效的對象。

所以,new/delete(或new[]/delete[])是要走的路。如果您願意,您仍然可以使用malloc,但只能用於「POD」類型(原始類型,舊式結構等)。如果您使用malloc進行分配,請使用free發佈。不要混淆newfreemallocdelete(有一個例外:見下文邁赫達德Afshari的評論)。

5
std::vector<std::string> strings(5); 

這就是你真正想要的。

0

正如Etienne所說,你應該使用新的作爲malloc只分配內存,但不調用初始化該內存的構造函數。 std :: string是一個類,當你想在堆上創建它的實例時,必須使用新的,就像其他任何類類型一樣。 你試圖寫錯地址,因此你的分段錯誤。您要創建字符串數組。在C中,你將使用數組,但在C++中使用std :: vector。

0

你可能不希望做這樣的說法,但如果你是,即使用malloc分配內存,那麼你需要使用放置新的。

其實,這是不行的佈局,新的爲您服務。

std::vector<std::string> vec; 
vec.reserve(5); 
vec.resize(5); 

調用儲備()分配給你的內存,然後調整()實際上會在內存中有物體已經分配的,放置新的。

Placement new in the C++ FAQ很好地記錄在這裏。閱讀它來學習。那麼可能只是使用矢量。