[原创文章欢迎转载,但请保留作者信息] Justin 于 2009-12-14
55条军规里,这第17条算是单看标题就能记住的规矩之一。
说的东西其实也比较简单:
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()); 这行语句有问题,这个复杂的参数表包含了三个动作:
-
new 一个 Widget
-
用new的Widget做为参数执行share_ptr的构造函数
-
执行priority
C++的某个编译器可能为了效率而自作主张,导致这三个动作的执行顺序是不确定的!因此上面的动作执行顺序可能是这样的:
-
new 一个 Widget
-
执行priority
-
用new的Widget做为参数执行share_ptr的构造函数
这个时候如果priority的执行出错而引发异常,就会发生内存泄漏(Memory Leak),因为new出来的Widget再也无法跟踪了。
而解决方法也很简单,不要妄图一行写完所有程序,分开来老老实实写就是了:
std::tr1::shared_ptr<Widget> pw(new Widget); processWidget(pw, priority());
|