Boost智能指针之scoped_ptr

Boost的智能指针库smart_ptr包含了6种智能指针,如下圈住部分所示:

Boost智能指针之scoped_ptr

这里来使用一下scoped_ptr指针,它与C++98的智能指针(auto_ptr,在C++11后被抛弃,因此不推荐使用)和C++11新加的unique_ptr(用来取代auto_ptr)很类似,能够保证动态创建的对象在任何时候都可被正确删除。其声明如下:( 可以看到,智能指针是一个对象,而不是一个指针,它引用了一个实际使用的对象 )

Boost智能指针之scoped_ptr

private域可以看到,在声明初始化一个scoped_ptr指针后,不能再对其进行比较、复制等操作,正如其名:scoped,限定了所有权就是自己的,保证了指针的绝对安全,同样,一个类内部成员如果是scoped_ptr,那么它也具有同样行为,即不能进行拷贝构造函数调用。

下面看看不用智能指针,在发送异常没有捕捉处理时的情况:

Boost智能指针之scoped_ptr

可以看到,{}作用域之后,Compute类的析构函数没有被调用,下面用scoped_ptr来进行改写:

Boost智能指针之scoped_ptr

可以看到,超出作用域之后,对象自动释放了。

因此,使用智能指针,可以减少忘记delete代码造成的内存泄漏,但是,异常处理时还是要进行一些处理的,smart_ptr库的其他的智能指针可以参考其声明模板进行测试使用即可。

附:

因为使用c++11特性,编译时最好指定一下,如下为本makefile:

Boost智能指针之scoped_ptr