Re: [問題] operator new[] 和 delete[] 混用

看板C_and_CPP (C/C++)作者 (唉唷喂)時間16年前 (2009/05/22 16:48), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《legnaleurc (CA)》之銘言: : ※ 引述《ilway25 (唉唷喂)》之銘言: : : 由於特殊需求,要加強效率,在配置空間時, : : 不必呼叫 constructor (會浪費時間) : : 但釋放時,又必須呼叫 destructor : : T* data = static_cast<T*>(operator new[](size * sizeof(T))); : : delete []T; : : 我想問的是,delete 是否不能這樣寫? : : 會不會有 undefined behavior ? : : 還是一定要用 operator delete[](T); ? : : 這樣又要如何呼叫 destructor 呢囧 謝謝! : 不是 delete 的問題,這個容器初始化就己經一團糟了 : 你只配置空間,不初始化T : 我猜之後會有個操作來"初始化" T:(初始化程序只能交給ctor,這裡的初始化是錯誤說法) : data[i] = T(); : 問題是 data[i] 裡的 T 沒初始化 : 所以它的 operator = 根本不存在 : 或者說所有的 member 都不能正常使用 : memcpy ? 只是掉進另一個泥沼而己 : 如果 T 的初始化很慢,讓 T 自己處理 : 你不會比 T 還了解它要怎麼配置的 其實我現在是在想有沒有更快的處理方式。 一切問題由下衍生.... 假設我寫的 array,size 是 16,capacity 也是 16, 以 capacity 倍增的方式實作。 那現在要多加一個項目,不是要另外配置大小 32 的空間嗎? 最直覺的想法是,如果那 32 個空間有初使化過, 那將前 16 個用 = 放過來即可。 但是現在為了效率起見,想到有 memcpy 可以用。 感覺上,其實前 16 個可以不必初始化,直接以 memcpy 複製即可。 但是,如果那前 16 的內容又會牽涉到他們的記憶體位置, 可能在他的 assignment operator 裡會有實作, 以 memcpy 複製又有問題。 (將一個好的物件 assign 給一個未初始化的物現,是不合法的。 那個物件得先初始化) 然後整個就變得很複雜... 因此,是不是不建議用 memcpy,還是一步一步用迴圈加 = 來吧? 或者是用上篇文章所說的,一個一個元素做 placement new? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.245.11 ※ 編輯: ilway25 來自: 140.112.245.11 (05/22 16:52) ※ 編輯: ilway25 來自: 140.112.245.11 (05/22 16:58)

05/22 17:14, , 1F
另外請問一下,如果使用者就copy ctor 和assignment op
05/22 17:14, 1F

05/22 17:15, , 2F
做不同的事,那將元素放到vector後,會變怎樣要自己負責了??
05/22 17:15, 2F

05/22 17:19, , 3F
對,使用者有義務提供行為一致的 ctor 和 copy-assign
05/22 17:19, 3F

05/22 17:22, , 4F
所以我最後的提出的2項都算是可行的辦法嗎?謝謝~
05/22 17:22, 4F

05/22 17:39, , 5F
placement new 比較好,可以少呼叫 default-ctor
05/22 17:39, 5F

05/22 17:44, , 6F
跟我想的一樣,謝謝指點!!
05/22 17:44, 6F
文章代碼(AID): #1A5cRDEO (C_and_CPP)
文章代碼(AID): #1A5cRDEO (C_and_CPP)