我正在研究使用類超載新聞和刪除與放置新聞之間的優缺點。我的意思是,要麼聲明我可能希望新建的每個類,並用自己的運算符重載刪除它們,要麼通過使用內存管理器通過放置新的方法爲我提供所需的內存。類重載新的和刪除vs定位新的定製內存類
我有一個存儲器管理器,允許我從多個池分配內存:
enum MemPool
{
kPool1,
kPool2,
}
class MemoryManager
{
public:
template <typename T>
void* Allocate(MemPool pool);
void Remove(MemPool pool, void* ptr);
};
MemoryManager g_mmgr;
的分配是模板因爲在調試模式下我存儲每個分配(經由typeid的(T)的名稱。名稱()),我可以通過的sizeof得到每個分配的大小(T)
我把自己看作具有至少2個選擇如何分配,我試圖決定哪個是最好的語法使用方面,效率,安全性和便攜性。
選項1是一個帶有新聞和刪除的模板化基類,它包裝了mempool並且很適合我。
template <typename T, MemPool pool>
class MemPoolUser
{
public:
static void* operator new(int size)
{
return g_mmgr.Allocate<T>(pool);
}
static void operator delete(void* ptr)
{
g_mmgr.Remove(pool,ptr);
}
};
然後我可以保證每一個可通過的MemoryManager需要newing類這樣宣稱:
class MyClass : public MemPoolUser<MyClass, kPool1>
{
};
這將讓我簡單地做
MyClass* c = new MyClass();
...
delete c;
和正確的新並在MemPoolUser內部刪除將被調用。
方案2是使用放置消息:
class MyClass
{
};
MyClass* c = new (g_mmgr.Allocate<MyClass>(kPool1)) MyClass();
....
c->~MyClass();
g_mmgr.Remove(kPool1,c);
任何利弊每個選項?選項1似乎很整潔,但我必須知道每個類需要分配的mempool類型,這可能取決於其他運行時因素。
選項2是更靈活,但newing和刪除在語法上是醜陋的(它可以被包裹在#define語句)
所以我的問題是,除了上面所說的問題,有什麼事我都未能考慮這兩種選擇,並且比另一種更危險?
我實際上想嘗試的是有一個模板化的全局新建和刪除,它將mempool作爲一個類型與新對象的類型一起使用,但即使我可以定義這些函數,也不可能稱它們爲而不明確地呼叫運營商新的,這將不會呼叫ctor或dtor進行刪除。 –
makar
2013-04-24 13:57:53