C()-6ren">
gpt4 book ai didi

c++ - 用池分配器覆盖 'new';返回 NULL?

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:59 24 4
gpt4 key购买 nike

如果 operator new 返回 null,有没有办法调用类构造函数?

考虑这个 C 类:

class C {
public:
C() { printf("%p->C()\n", this); }
~C() { printf("%p->~C()\n", this); }

static void* operator new(std::size_t sz) {
printf("new!\n");
return NULL;
}
};

int main()
{
C* c = new C();
printf("new C returns %p\n", c);
return 0;
}

当我运行时,我得到这个:

new!
0x0->C()
new C returns 0x0

所以我可以使 new 返回 NULL,但它仍然使用空“this”指针调用构造函数。有什么方法可以编写我自己的分配器来分配内存,如果可能的话显式调用 c'tor,然后返回?

谢谢!

最佳答案

operator new 返回一个空指针意味着分配失败,但前提是该函数被声明为 noexcept,否则该函数最会抛出一个 std::bad_alloc(或从中派生的东西)。

目前你的程序有未定义的行为,如果你添加 noexcept 你应该发现构造函数没有被调用,因为函数现在正确地发出分配失败的信号。

static void* operator new(std::size_t sz) noexcept

[basic.stc.dynamic.allocation]

  1. An allocation function shall be a class member function or a global function;[...]
  1. [...] If an allocation function that has a non-throwing exception specification (15.4) fails to allocate storage, it shall return a null pointer. Any other allocation function that fails to allocate storage shall indicate failure only by throwing an exception (15.1) of a type that would match a handler (15.3) of type std::bad_alloc (18.6.2.1).

关于c++ - 用池分配器覆盖 'new';返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35027861/

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