這是我的場景,我試圖重載新的和全局刪除。我在一個名爲allocator.h的文件中編寫了我的分配器類。而我試圖實現的是,如果一個文件包含這個頭文件,我應該使用我的新版本和刪除版本。重載新/刪除問題
在頭文件所以「allocator.h」我已經宣佈了兩項功能
extern void* operator new(std::size_t size);
extern void operator delete(void *p, std::size_t size);
我相同的頭文件我有一個類,做所有的東西分配器,
class SmallObjAllocator
{
...
};
我想從新的和刪除函數中調用這個類,我希望這個類是靜態的,所以我這樣做了:
template<unsigned dummy>
struct My_SmallObjectAllocatorImpl
{
static SmallObjAllocator myAlloc;
};
template<unsigned dummy>
SmallObjAllocator My_SmallObjectAllocatorImpl<dummy>::myAlloc(DEFAULT_CHUNK_SIZE, MAX_OBJ_SIZE);
typedef My_SmallObjectAllocatorImpl<0> My_SmallObjectAllocator;
和cpp文件,它看起來像這樣:allocator.cc
void* operator new(std::size_t size)
{
std::cout << "using my new" << std::endl;
if(size > MAX_OBJ_SIZE)
return malloc(size);
else
return My_SmallObjectAllocator::myAlloc.allocate(size);
}
void operator delete(void *p, std::size_t size)
{
if(size > MAX_OBJ_SIZE)
free(p);
else
My_SmallObjectAllocator::myAlloc.deallocate(p, size);
}
問題是,當我嘗試調用的類SmallObjAllocator這是一個靜態對象的構造。出於某種原因,編譯器在初始化時調用我的重載函數new。所以它然後嘗試使用My_SmallObjectAllocator :: myAlloc.deallocate(p,size);這是沒有定義,所以程序崩潰。
那麼爲什麼當我定義一個靜態對象時編譯器會調用new?我該如何解決它?
我沒有得到模板構造的目的。爲什麼不讓SmallObjAllocator成爲單例,並在allocator.cc中創建對象? – 2010-05-06 08:43:10
作爲一種猜測,他希望在某一點上執行「My_SmallObjectAllocator <1>」並獲得第二個分配器。 – 2010-05-06 08:52:33
SmallObjectAllocator的構造函數中會發生什麼? – 2010-05-06 08:54:47