重载新/删除问题
问题描述:
这是我的场景,我试图重载新的和全局删除。我在一个名为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?我该如何解决它?
答
如果您自己提供,则不能使用运行时库的全局operator new
。所以,你不能使用new
来实现new
,即使在初始化时也是如此。在不同的源文件中使用不同的operator new
违反了单定义规则。
消除来自SmallObjAllocator::SmallObjAllocator
构造的new
呼叫,或实现由全球bool new_uninitialized
或局部static bool new_is_recursing
标志激活的特殊情况。
我没有得到模板构造的目的。为什么不让SmallObjAllocator成为单例,并在allocator.cc中创建对象? – 2010-05-06 08:43:10
作为一种猜测,他希望在某一点上执行“My_SmallObjectAllocator ”并获得第二个分配器。 – 2010-05-06 08:52:33
SmallObjectAllocator的构造函数中会发生什么? – 2010-05-06 08:54:47