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

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/05/22 16:19), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串3/4 (看更多)
其實我大致可以了解原 po 的需求 那就是把「配置空間」與「執行 ctor 初始化」的動作分離 比如說 std::vector 會預先配置更多的空間以備不時之需 在配置時並不需要呼叫 ctor 只有在真正塞元素進去時才需要初始化 在 C++ 中可以用 placement new 來做到這件事 舉例來說,我們現在要實做一個 stack: template <typename T> class Stack { public: Stack(size_t n = 16); // 預設先配置 16 個元素的空間 ~Stack(); void push(const T& t); void pop(); T& top() const; Stack(const Stack<T>&); // copy-ctor Stack& operator=(const Stack<T>&); // copy-assignment private: char* my_block; // 預先配置的記憶體區塊 size_t my_size; // 現有的元素數量 size_t my_allocated; // 已預先配置的空間量 void reallocate(size_t n); // 預先配置的空間不夠時重新配置 }; template <typename T> Stack<T>::Stack(size_t n) : my_block( new char[sizeof(T)*n] ), my_size(0), my_allocated(n) {} template <typename T> void Stack<T>::push(const T& t) { if(my_size >= my_allocated) reallocate(my_allocated * 2); // placement new // 在預先配置好的空間上呼叫 copy-ctor 來產生物件 new (my_block + my_size) T(t); ++my_size; } template <typename T> void Stack<T>::pop() { // 消滅最頂端的物件 T& t = top(); t.~T(); // 手動呼叫 dtor --my_size; } template <typename T> Stack<T>::~Stack() { // 手動對 stack 中所有物件呼叫 dtor // 因為稍後釋放 my_block 時並不會呼叫物件的 dtor! while(my_size) pop(); // 釋放記憶體空間 delete [] my_block; } top() 和 reallocate() 我就不寫了,相信你知道寫法... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.151.2 ※ 編輯: littleshan 來自: 219.87.151.2 (05/22 16:21)

05/22 16:50, , 1F
對了,接近我的需求了xd
05/22 16:50, 1F

05/22 16:51, , 2F
但是在reallocate時,可否用memcpy呢?
05/22 16:51, 2F

05/22 17:16, , 3F
萬萬不可用 memcpy!
05/22 17:16, 3F
文章代碼(AID): #1A5c0Fkk (C_and_CPP)
文章代碼(AID): #1A5c0Fkk (C_and_CPP)