WEB开发网
开发学院软件开发C语言 C# vs C++之二:GC vs RAII 阅读

C# vs C++之二:GC vs RAII

 2010-09-30 20:49:59 来源:WEB开发网   
核心提示: 栈语义在介绍RAII之前,让我们先来看一道C++面试题:“重构下面的代码,C# vs C++之二:GC vs RAII(3),在保证正确释放资源的情况下,去掉多余的try catch”//C++void f(){ try{ int *ptr = new int(123);

栈语义

在介绍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类模板类似。

上一页  1 2 3 4  下一页

Tags:vs GC vs

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接