2011-08-07 71 views
2

我不清楚爲什麼這應該失敗,失敗的原因在那裏它:動態分配的字符串數組c

std::string* s; 
s = (std::string*)malloc(sizeof(std::string) * 10); 
s[0] = "string0"; 
s[1] = "string1"; 
s[2] = "string2"; //Segmentation fault 

不要緊,什麼串的分配在S上的大小[0] - s [2]是多少,或者多少空間malloc'ed。 QStrings也會發生同樣的情況。我認爲麻煩來自std :: string包含一個內部指針這一事實,所以sizeof()只返回指針的大小,但考慮到std :: string的行爲類似於其他值(=,==等)。 )我不明白爲什麼這會導致失敗。

此外,爲了與其他代碼兼容,我需要在這裏使用C數組,的std ::向量。我正在尋找一個通用的解決方案(這將與QString,QDateTime等),如果有的話。但我很高興知道發生了什麼。

編輯:有一個downvote ......這個問題出了什麼問題?我確實先看了一會兒(包括SO),但沒有發現這個問題。

+1

你真的應該在這種情況下使用'new'(或'new []')來動態分配對象。你不能標記這個C,因爲它是C++。 – 2011-08-07 10:35:12

+0

是的,std在C中是不允許的。 – tjameson

+0

@WTP使用new來動態分配什麼? –

回答

10

你不能malloc類對象的數組,因爲這個函數不會調用任何構造函數。你只是得到內存充滿了垃圾,然後你嘗試重新解釋爲一個類對象的數組。

C++對象的數組分配new[]

至於與其他代碼的兼容性,您可能可以使用std::vector,因爲&vec[0]爲您提供了指向連續數組中第一個元素的指針。


如果你堅持要用mallocfree,那麼你需要手動調用構造函數爲每個陣列項目與安置新釋放之前手動調用析構函數的每個。

+0

',因爲&vec [0]給你一個指向連續數組中第一個元素的指針' - 不幸的是,如果矢量爲零大小,則不會。 – john

5

問題是std :: string有一個必須被調用的構造函數。

不是說有一個字符串數組是一個好主意,但如果你必須:

string* s = new string[10]; 
3

問題就出現了,因爲你不應該使用malloc與構造函數類的分配空間(類似的std :: string ),除非你真的,真的知道你在做什麼。做到這一點最簡單的方式,並使用新的

std::string* s; 
s = new std::string[10]; 
s[0] = "string0"; 
s[1] = "string1"; 
s[2] = "string2"; 

的techinical原因爲您的代碼不工作是你沒有任何建造你的字符串,因爲你已經不叫它們的構造函數,你會得到一個未初始化的內存塊。另一方面,new在它分配的內存上調用std :: string構造函數。

0

你可能想要的是一個字符串矢量:

std::vector<std::string> s(3); 
s[0] = "string0"; 
s[1] = "string1"; 
s[2] = "string2"; 

而且,與其他代碼的兼容性,我需要在這裏使用C數組,而不是如的std ::矢量

您可以獲取原始指針的第一個元素互操作與遺留代碼:

string* p = &s[0]; 
+0

他明確地說,不是std :: vector。 – john

1

使用malloc,該的std :: string的構造不叫。這可能是原因。順便說一句,爲什麼在使用std :: string時使用malloc來分配內存?什麼阻止你使用新的?

+0

我正在編寫模板代碼,我想用於雙打,整數等等,對於那些我認爲使用數組會更高效的代碼。沒有看到這個問題來了...:( –

+0

@Matt:特別是如果你正在使用模板,那麼你通常不能使用任何不知道類型的C庫函數。 – UncleBens

+0

@UncleBens是的,它看起來像你釘了它,我要給線程多一點時間來「解決」然後關閉它。 –

1

前面已經提到:

You can not malloc an array of class objects, because this 

功能不調用任何構造函數。你只是用垃圾填充內存 ,然後你嘗試重新解釋爲類 對象的數組。

如果你想[作爲一種解決方法]做到這一點:

的char * S [10];

for(int i = 0; i < 10; i ++)s [i] = new char [10];

strcpy(s [0],「string0」);

strcpy(s [1],「string1」);

strcpy(s [2],「string2」);