2010-05-06 52 views
0

這是我的場景,我試圖重載新的和全局刪除。我在一個名爲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?我該如何解決它?

+2

我沒有得到模板構造的目的。爲什麼不讓SmallObjAllocator成爲單例,並在allocator.cc中創建對象? – 2010-05-06 08:43:10

+0

作爲一種猜測,他希望在某一點上執行「My_SmallObjectAllocator <1>」並獲得第二個分配器。 – 2010-05-06 08:52:33

+0

SmallObjectAllocator的構造函數中會發生什麼? – 2010-05-06 08:54:47

回答

2

如果您自己提供,則不能使用運行時庫的全局operator new。所以,你不能使用new來實現new,即使在初始化時也是如此。在不同的源文件中使用不同的operator new違反了單定義規則。

消除來自SmallObjAllocator::SmallObjAllocator構造的new呼叫,或實現由全球bool new_uninitialized或局部static bool new_is_recursing標誌激活的特殊情況。