2016-02-12 32 views
-1

爲什麼這項工作...我的心智模式有什麼問題?

string str("special_string"); 
string arr[10]; 
arr[0] = str; 

,而這會導致賽格故障?

string str("special_string"); 
string *buf = (string*)malloc(sizeof(string) * 10); 
buf[0] = str; /* or *buf = str; */ 

這兩個實例都不是一個按值副本嗎?

+0

你不應該用'string'來使用malloc。 – ashiquzzaman33

+0

也許我的問題並沒有暗示我的實際意圖,即創建一個堆分配的字符串數組。 –

+0

@c_dubs改爲使用'std :: vector '。 –

回答

0

雖然這會導致seg-fault?

,因爲你在這裏有一個問題:

string *buf = (string*)malloc(sizeof(string)); 

你只分配內存,但不初始化std::string類型的對象適當的malloc()不會調用構造函數。如果您使用operator new,而不是你的代碼將工作:

string str("special_string"); 
string *buf = new string; 
*buf = str; 

,當然你應該使用delete而不是free()當你將需要銷燬該對象。

+0

我想創建一個堆分配的字符串數組(我知道我原來的問題並沒有真正暗示這個意圖)。 –

+0

好的,我現在明白了。它不是一個按值副本,它調用字符串的複製構造函數,在嘗試將未初始化的內存解釋爲字符串並訪問其數據緩衝區時導致seg-fault。 –

+0

@c_dubs不,它調用賦值操作符(可能會調用copy ctor,但很可能不會),但是它會崩潰,因爲對象是未初始化的 – Slava