为什么重载的new运算符正在调用构造函数,即使我在重载函数中使用malloc?

时间:2015-06-29 01:10:53

标签: c++

我正在尝试了解重载新运算符。我编写了如下代码。

#include <iostream>
#include <cstdlib>
#include <new>

using namespace std;

class loc
{
    int lo, la;

    public:
        loc()
        {
        }

        loc(int x, int y)
        {
            cout << "In constructor\n";
            lo = x;
            la = y;
        }

        void show()
        {
            cout << lo << " ";
            cout << la << endl;
        }

        void *operator new(size_t sz);
        void operator delete(void *p);
};

void *loc::operator new(size_t sz)
{
    cout << "in Overloaded new\n";
    void *p = malloc(sz);

    return p;
}

void loc::operator delete(void *p)
{
    cout << "in Overloaded delete\n";
    free(p);
}

int main()
{
    loc *p1 = new loc(10, 20);
    p1->show();
    delete p1;
    return 0;
}

我认为它不会调用构造函数,因为我在重载函数中重载了带有malloc函数调用的new运算符。但输出结果如下。

in Overloaded new
In constructor
10 20
in Overloaded delete

这意味着构造函数被调用。这怎么可能?这是否意味着malloc()会调用构造函数吗?

1 个答案:

答案 0 :(得分:7)

new expression导致发生两件事:分配对象开始创建所需的内存,以及初始化对象。

另一方面,new operator只处理分配部分。当您针对特定类重载new运算符时,您将替换对象的内存分配。

当您意识到并非所有对象都在堆上分配时,这种功能划分才有意义。考虑以下情况:

int main() {
    string someString;
    ..
}

不动态分配局部变量; new未使用;但是仍然需要初始化对象,因此仍然会调用构造函数。请注意,您不需要显式调用构造函数 - 在语言中隐含的是,在创建对象时,将始终调用适当的构造函数来初始化对象。

当你编写一个新的表达式时,编译器知道发出指令来调用new运算符(根据需要分配内存),然后调用构造函数(初始化对象)。无论是否重载新运算符,都会发生这种情况。