爲什麼這項工作...我的心智模式有什麼問題?
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; */
這兩個實例都不是一個按值副本嗎?
爲什麼這項工作...我的心智模式有什麼問題?
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; */
這兩個實例都不是一個按值副本嗎?
雖然這會導致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()
當你將需要銷燬該對象。
我想創建一個堆分配的字符串數組(我知道我原來的問題並沒有真正暗示這個意圖)。 –
好的,我現在明白了。它不是一個按值副本,它調用字符串的複製構造函數,在嘗試將未初始化的內存解釋爲字符串並訪問其數據緩衝區時導致seg-fault。 –
@c_dubs不,它調用賦值操作符(可能會調用copy ctor,但很可能不會),但是它會崩潰,因爲對象是未初始化的 – Slava
你不應該用'string'來使用malloc。 – ashiquzzaman33
也許我的問題並沒有暗示我的實際意圖,即創建一個堆分配的字符串數組。 –
@c_dubs改爲使用'std :: vector'。 –