[問題] placement new & copy ctor

看板C_and_CPP作者 (xatier)時間12年前 (2012/05/31 23:10), 編輯推噓5(5011)
留言16則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Ubuntu Linux / g++ 4.6 問題(Question): http://ideone.com/f1Ctt 我先用 operator new [] 要了一塊空間給 p 之後想把 p 裏面每個元素都用 kerker 這個物件 initialize 我的想法是透過 copy constructor 把 kerker 複製一份後塞給 p 裏面的空間 這樣似乎會造成 runtime error ? 然後又做了實驗,把 *p = T(kerker); 換成 p = new T(kerker); 這樣就能成功 同樣都是去 call T 的 copy constructor 兩者是差在那邊呢@@? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.247.99

05/31 23:34, , 1F
直接寫 T *p = new T[3]; 就可以啦
05/31 23:34, 1F

05/31 23:38, , 2F
根據網友 adxis 的水球,好像可以用 new (p+i) T(kerker);
05/31 23:38, 2F

05/31 23:38, , 3F
研究中...
05/31 23:38, 3F

05/31 23:39, , 4F
http://tinyurl.com/3yaaj4y 你那樣寫 就是他範例的case 3
05/31 23:39, 4F

05/31 23:39, , 5F
沒跑constructor 所以你的string a沒被建構 裡面出了啥差錯
05/31 23:39, 5F

05/31 23:40, , 6F
不得而知
05/31 23:40, 6F

05/31 23:41, , 7F
但是這樣就失去 placement new的意義了~
05/31 23:41, 7F

05/31 23:42, , 8F
Hmmm... 原來如此,我再試試看 >"<
05/31 23:42, 8F

05/31 23:44, , 9F
啊我想錯了~用a大的方式就沒有錯 但是會發生exception原因
05/31 23:44, 9F

05/31 23:44, , 10F
還是滿好奇的....
05/31 23:44, 10F

05/31 23:50, , 11F
你*p = 是呼叫T的operator = 但你沒寫這optr 所以她在做copy
05/31 23:50, 11F

05/31 23:51, , 12F
的時候 string a = T(kerker).a 壞掉了
05/31 23:51, 12F

06/01 00:06, , 13F
了解...
06/01 00:06, 13F

06/01 01:00, , 14F
06/01 01:00, 14F

06/01 01:11, , 15F
感謝板主! 好清楚的 faq!
06/01 01:11, 15F

06/01 01:50, , 16F
see also http://ppt.cc/SRuf or use std::allocator
06/01 01:50, 16F
文章代碼(AID): #1Fnue3Zu (C_and_CPP)
文章代碼(AID): #1Fnue3Zu (C_and_CPP)