读书人

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

发布时间: 2012-09-19 13:43:54 作者: rapoo

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

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

定义class object,

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极力解释清楚,但我还是有些不明白。你有更好的解释,可以知会我一下,不甚感谢!


读书人网 >C++

热点推荐