Re: [問題] operator new[] 和 delete[] 混用
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間16年前 (2009/05/22 16:19)推噓0(0推 0噓 3→)留言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
05/22 16:50, 1F
→
05/22 16:51, , 2F
05/22 16:51, 2F
→
05/22 17:16, , 3F
05/22 17:16, 3F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章