Re: [問題] operator new[] 和 delete[] 混用
※ 引述《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
05/22 17:14, 1F
→
05/22 17:15, , 2F
05/22 17:15, 2F
推
05/22 17:19, , 3F
05/22 17:19, 3F
→
05/22 17:22, , 4F
05/22 17:22, 4F
推
05/22 17:39, , 5F
05/22 17:39, 5F
→
05/22 17:44, , 6F
05/22 17:44, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章