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

时间:2016-01-27 02:39:38

标签: c++

如果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,然后返回?

谢谢!

1 个答案:

答案 0 :(得分:2)

operator new返回空指针意味着分配失败,但仅当函数声明为noexcept时,否则函数最多抛出std::bad_alloc(或从中派生的东西)。

由于您的程序存在未定义的行为,如果添加noexcept,您应该会发现构造函数未被调用,因为该函数现在正确地表示分配失败。

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

[basic.stc.dynamic.allocation]

  
      
  1. 分配函数应为类成员函数或全局函数; [...]
  2.   
  
      
  1. [...]如果具有非抛出异常规范(15.4)的分配函数无法分配存储,则它应返回空指针。任何其他无法分配存储的分配函数都应仅通过抛出与std::bad_alloc类型的处理程序(15.3)(18.6.2.1)相匹配的类型的异常(15.1)来指示失败。
  2.