重载新/删除问题

问题描述:

这是我的场景,我试图重载新的和全局删除。我在一个名为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 ”并获得第二个分配器。 – 2010-05-06 08:52:33

+0

SmallObjectAllocator的构造函数中会发生什么? – 2010-05-06 08:54:47

如果您自己提供,则不能使用运行时库的全局operator new。所以,你不能使用new来实现new,即使在初始化时也是如此。在不同的源文件中使用不同的operator new违反了单定义规则。

消除来自SmallObjAllocator::SmallObjAllocator构造的new呼叫,或实现由全球bool new_uninitialized或局部static bool new_is_recursing标志激活的特殊情况。