operator new不调用构造函数

时间:2012-08-10 22:45:25

标签: c++

考虑一下belo代码片段:

class Base
{
    public:
    Base()
    {
            cout<<"Constructor"<<endl;
    }
    Base(const Base& rhs)
    {
            cout<<"Copy constructor"<<endl;
    }
    Base* Clone()
    {
            return new Base(*this); <--------------- 2
    }
    void* operator new(size_t size)
    {
            void* p=malloc(size);
            cout<<"Inside new"<<endl;
            return p;
    }
};

int main()
{
    Base b1; <------------ 1
    Base* ptr=b1.Clone();
    return 0;
}

我得到的是output

Constructor
Inside new
Copy constructor  

我一直听说第一个运算符new分配了一大块void类型&amp;然后new运算符调用构造函数将该块转换为与LHS上的类型完全相同的类型 那么,为什么没有为语句2调用构造函数?

我还想知道C ++编译器对语句2采取的一系列精确行动。

2 个答案:

答案 0 :(得分:7)

  

那么,为什么没有为语句2调用构造函数?

是的。你认为"Copy constructor"来自哪里?

Base b1;

输出:Constructor

Base* ptr=b1.Clone();

来电

new Base(*this);

反过来调用你的operator new然后调用你的复制构造函数。

答案 1 :(得分:0)

T * p = new T(a, b, c); delete p;的实施在道德上等同于这个序列:

void * const addr = operator new(sizeof T);   // either global or in T

T * p = new (addr) T(a, b, c);                // ditto

p->~T();

operator delete(addr);                        // ditto

结果是内存分配和对象构造是C ++中两个截然不同的概念。