看板 C_and_CPP 關於我們 聯絡資訊
其實我大致可以了解原 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)
ilway25:對了,接近我的需求了xd 05/22 16:50
ilway25:但是在reallocate時,可否用memcpy呢? 05/22 16:51
littleshan:萬萬不可用 memcpy! 05/22 17:16