重载新/删除问题

时间:2010-05-06 08:34:16

标签: c++ templates memory-management static-members

这是我的方案,我试图超载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?我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

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

new构造函数中删除SmallObjAllocator::SmallObjAllocator调用,或者实现由全局bool new_uninitialized或本地static bool new_is_recursing标记激活的特殊情况。