这是我的方案,我试图超载new并全局删除。我已经在一个名为allocator.h的文件中编写了我的allocator类。而我想要实现的是,如果文件包含此头文件,则应使用我的新版本和删除版本。
所以在头文件“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?我该如何解决呢?
答案 0 :(得分:2)
如果您提供自己的,则无法使用运行时库的全局operator new
。因此,您无法使用new
来实现new
,即使在初始化中也是如此。在不同的源文件中使用不同的operator new
违反了单定义规则。
从new
构造函数中删除SmallObjAllocator::SmallObjAllocator
调用,或者实现由全局bool new_uninitialized
或本地static bool new_is_recursing
标记激活的特殊情况。