这是我的场景,我试图重载 new 并全局删除。我在一个名为 allocator.h 的文件中编写了我的分配器类。我想要实现的是,如果文件包含此头文件,则应使用我的 new 和 delete 版本。
所以在头文件“allocator.h”中我声明了这两个函数
extern void* operator new(std::size_t size);
extern void operator delete(void *p, std::size_t size);
我有一个相同的头文件,我有一个类可以完成所有分配器的工作,
class SmallObjAllocator
{
...
};
我想从 new 和 delete 函数中调用这个类,我希望这个类是静态的,所以我这样做了:
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 呢?我该如何解决?