重载全局运算符new(非POD)

时间:2019-02-01 02:17:20

标签: c++ overloading new-operator

请考虑以下示例:

void * operator new(size_t size)
{
    void * p = malloc(size);
    //Error handling supressed...
    return p;
}

void operator delete(void * p)
{
    free(p);
}

class foo
{
public:
    foo() { baz = 4234; }
    int baz;
};

class bar
{
public:
    bar() { np = new foo(); }
    ~bar() { delete np; }
    foo* np = nullptr;
};

int main(int argc, char* argv[])
{
    bar * a = new bar();
    printf("%d\n", (*a).np->baz);
    delete a;
    return 0;
}

我不明白为什么这样做。在这种情况下如何调用构造函数?都不是类ID POD(普通旧数据),它们都有构造函数和析构函数! static_assert授予我foobar不是POD,所以...

为什么printf在控制台上输出值4234?怎么了?这不应该给我带来意想不到的东西吗?我正在使用Visual Studio 15编译器。

1 个答案:

答案 0 :(得分:1)

根据[class.ctor]/8,调用默认构造函数以创建由new表达式创建的动态存储持续时间的类对象,其中new初始化器被省略(无论是否为默认{{1} }或用户定义的operator new)。

如果您不为类提供任何构造函数,则编译器将始终将默认构造函数声明为内联公共成员。 并且,如果未将隐式声明的默认构造函数定义为已删除,则将定义i t

因此,在这种情况下,将为operator newfoo调用默认的构造函数。