重载全局 operator new(非 POD)

Overloading global operator new (non-POD)

考虑以下示例:

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;
}

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

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

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

如果您不为 class 提供任何构造函数,编译器将始终将默认构造函数声明为内联 public 成员。 如果隐式声明的默认构造函数未定义为已删除,则 it 被定义为.

因此在这种情况下,为 foobar 调用了默认构造函数。