C# vs C++之二:GC vs RAII
2010-09-30 20:49:59 来源:WEB开发网栈语义
在介绍RAII之前,让我们先来看一道C++面试题:“重构下面的代码,在保证正确释放资源的情况下,去掉多余的try catch”
//C++
void f(){
try{
int *ptr = new int(123);
…//do something with ptr
delete ptr;
}
catch {
delete ptr;
}
}
代码中new int在堆上分配内存,并通过delete小心翼翼地释放内存。这是典型的C风格的C++代码,虽然用了try、catch等高级语法,但资源管理方式依旧是C。按C++特有的方式可以重构成这样:
//C++
//定义资源代理类模板
template<typename T>
class Resource{
public:
Resource(T *ptr) { this->ptr = ptr;} //构造函数中初始化资源
~Resource() { delete ptr; } //析构函数中释放资源
T& operator*() { return *ptr; } //重载*运算符
T* operator->() { return ptr; } //重载->运算符
//…省略了拷贝构造函数和赋值运算符等
private:
T* ptr;
};
void f(){
Resource<int> r(new int(123));
//do something with r
}
f函数中,我们在栈上创建了一个资源模板类Resource的对象r,并通过r来提供服务。只是这么简单的一包装,就省掉了繁琐易错的try,catch,不管f内部出什么问题,抛什么异常,都能保证r所管理的内存资源最终被正确释放。C++保证一旦离开词法作用域,在任何情况下都会调用栈上对象的析构函数,这就是所谓的“栈语义”(stack semantics)。事实上,STL已经有auto_ptr这个智能指针类模板,其实现和上面的Resource类模板类似。
- ››VSFTP服务器配置详解
- ››gcc内置的for each
- ››VS2008 安装失败(“Web 创作组件”无法)的解决办...
- ››VS调用存储过程
- ››VS2005无法远程连接SQL数据库问题
- ››VS2010 Express中文版已经发布至MSDN
- ››VS2008C# 开发 Windows Mobile 6.0程序应注意的几...
- ››VS08中最简单也最实用的Ajax无刷新技术
- ››VS2003+nds OR VS2003+carbide.vs 开发 Symbian 程...
- ››VS2008 平台下进行 Windows Mobile 开发环境的搭建...
- ››VS 2010/.NET 4 RC版 发布了
- ››VS 2010的Intellisense相关崩溃的修补
更多精彩
赞助商链接