// store_new.cpp : 定义控制台应用程序的入口点。
//2011/9/24 by wallwind on sunrise
#include "stdafx.h"
#include <iostream>
#include <memory>
using namespace std;
class Widget
{
public:
Widget()
{
cout<<"Widget()"<<endl;
}
~Widget()
{
cout<<"Widget()"<<endl;
}
};
int priority()
{
throw new runtime_error("Exception");
//return 0;
}
void processWidger(auto_ptr<Widget> pw,int priority){}
int _tmain(int argc, _TCHAR* argv[])
{
processWidger(auto_ptr<Widget>(new Widget()),priority());
system("pause");
return 0;
}
1、调用X的构造函数。
2、调用auto_ptr<Widget>的构造函数。
3、调用Priority函数。
看上去井然有序的条件,C++编译器未必会选择这么做。也许编译器选择将调用Priority函数放在第二的位置会生成更高效的代码也说不定。那么顺序就会改为:
1、调用X的构造函数。
2、调用Priority函数。
3、调用auto_ptr<Widget>的构造函数。
那么如果调用Priority函数产生异常怎么办?auto_ptr并没有获得它需要保管的资源,而那段资源也不会遭到释放,有一种资源泄漏的方式。
解决方式就是在外面完成智能指针的存储,编译器对于跨越语句的各项操作不会选择重新排列。这样智能指针依然获得了对所指向资源的保护。
// store_new.cpp : 定义控制台应用程序的入口点。
//2011/9/24 by wallwind on sunrise
#include "stdafx.h"
#include <iostream>
#include <memory>
using namespace std;
class Widget
{
public:
Widget()
{
cout<<"Widget()"<<endl;
}
~Widget()
{
cout<<"Widget()"<<endl;
}
};
int priority()
{
throw new runtime_error("Exception");
//return 0;
}
void processWidger(auto_ptr<Widget> pw,int priority){}
int _tmain(int argc, _TCHAR* argv[])
{
auto_ptr<Widget> pw(new Widget());
processWidger(pw,priority());
system("pause");
return 0;
}
由于编译器对"跨越语句块的各项操作"失去了执行重新排列的自由,所以编译器不能在它们之间任意选择执行顺序.
请记住:
■ 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源
泄露.
1430



被折叠的 条评论
为什么被折叠?



