代码之家  ›  专栏  ›  技术社区  ›  Primemaster

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

  •  1
  • Primemaster  · 技术社区  · 6 年前

    请考虑以下示例:

    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盒(普通的旧数据)都没有构造函数和析构函数! static_assert 赐予我 foo bar 不是豆荚,所以…

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   P.W    6 年前

    按照 [class.ctor]/8 ,将调用默认构造函数来创建动态存储持续时间的类对象,该对象由新表达式创建,其中省略了新的初始值设定项(如果它是默认值,则不重要)。 operator new 或用户定义的 算子新 )

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

    因此,调用默认构造函数 foo bar 在这种情况下。

    推荐文章