如果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
所以我可以使新返回NULL,但它仍然使用null'this'指针调用构造函数。有没有办法编写我自己的分配内存,分配内存,如果可能,显式调用c'tor,然后返回?
谢谢!
答案 0 :(得分:2)
从operator new
返回空指针意味着分配失败,但仅当函数声明为noexcept
时,否则函数最多抛出std::bad_alloc
(或从中派生的东西)。
由于您的程序存在未定义的行为,如果添加noexcept
,您应该会发现构造函数未被调用,因为该函数现在正确地表示分配失败。
static void* operator new(std::size_t sz) noexcept
[basic.stc.dynamic.allocation]
- 分配函数应为类成员函数或全局函数; [...]
醇>
- [...]如果具有非抛出异常规范(15.4)的分配函数无法分配存储,则它应返回空指针。任何其他无法分配存储的分配函数都应仅通过抛出与
醇>std::bad_alloc
类型的处理程序(15.3)(18.6.2.1)相匹配的类型的异常(15.1)来指示失败。