c++ 嵌套new操作构造对像的执行顺序

来源:互联网 发布:mac命令行移动文件夹 编辑:程序博客网 时间:2024/04/30 05:59

       突然比较好奇如果在某中class对象在拷贝构造时的函数调用顺序,下面用代码说清楚我的问题:

       定义class object,

class object {     public:         ...     protected:         ...     private:         ...}


上面定义一个object类,假设其操作都为默认操作。那么执行下面的嵌套new代码:

new object(*new object);

虽然只有一行代码,但还是值得研究的。我们知道在类对象构造时,如果是new operator操作,其执行过程可以参考文章:new/delete operator和operator new/delete ,它说明了new操作其实是执行了两个步骤,其一是调用operator new,即申请一定大小的内存;其二是调用类的构造函数,在步骤一分配好的内存上调用产生类对象。那么双层new操作,其执行的步骤到底是怎么样的呢?         

 其结果不外乎两种:

         1.申请内存优先:

            1)为括号里的对象调用operator new;

            2)为括号外的对象调用operator new;

            3)为括号里的对象调用constructor;

            4)为括号外的对象调用constructor。

       2.对象构造完整性优先:

            1)为括号里的对象调用operator new;

            2)为括号里的对象调用constructor;

            3)为括号外的对象调用operator new;

            4)为括号外的对象调用constructor。

       两种方法都不会违反c++的标准,所以上面的执行顺序完全根据你使用的编译器不同而不同。但是这种执行顺序的不同会导致出现意外的结果,尤其是相同的代码在不同的系统中使用时。

        在scott meyers看来,申请内存优先中是先调用operator new获得内存空间,将内存空间设定位值,即将构造对象存在于heap中。而经过步骤3之后会导致步骤2的设定位值效果被清除,最后步骤4构造的对象会认为它不处于heap之中,但实际上确实是处于heap中。这部分的具体解释见《more effective c++》的条款27,即P150。

        虽然条款27极力解释清楚,但我还是有些不明白。你有更好的解释,可以知会我一下,不甚感谢!


原创粉丝点击