0

这是我的场景,我试图重载 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 呢?我该如何解决?

4

1 回答 1

2

operator new如果您提供自己的,则不能使用运行时库的全局。因此,您不能使用newto 实现new,甚至在初始化时也不能。在不同的源文件中使用 differentoperator new是违反单一定义规则的。

消除构造函数的new调用SmallObjAllocator::SmallObjAllocator,或实现由全局bool new_uninitialized或局部static bool new_is_recursing标志激活的特殊情况。

于 2010-05-06T10:16:43.880 回答