gpt4 book ai didi

c++ - 重载新建/删除问题

转载 作者:行者123 更新时间:2023-11-28 03:57:46 25 4
gpt4 key购买 nike

这是我的场景,我试图在全局范围内重载 new 和 delete。我在名为 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 呢?我该如何解决?

最佳答案

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

消除 SmallObjAllocator::SmallObjAllocator 构造函数中的 new 调用,或实现由全局 bool new_uninitialized 或局部 static bool new_is_recursing 标志。

关于c++ - 重载新建/删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2779622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com