使用Boost库中的组件进行C++内存管理

 

使用Boost库中的组件进行C++内存管理

分类: Boost学习   111人阅读  评论(0)  收藏  举报

目录(?)[+]

C++标准库中的auto_ptr,智能指针,部分的解决了获取资源自动释放的问题

在Boost中,提供了6中智能指针:scoped_ptr, scoped_array, shared_ptr, shared_array, weak_ptr, instrusive_ptt,这些智能指针属于smart_ptr组件

使用时: #include <boost/smart_ptr.hpp>  using namespace std;

接下来介绍前四个智能指针

scoped_ptr

类部分摘抄
[cpp]  view plain copy
  1. template<class T> class scoped_ptr // noncopyable  
  2. {  
  3. private:  
  4.   
  5.     T * px;  
  6.   
  7.     scoped_ptr(scoped_ptr const &);  
  8.     scoped_ptr & operator=(scoped_ptr const &);  
  9.   
  10.     typedef scoped_ptr<T> this_type;  
  11.   
  12.     void operator==( scoped_ptr const& ) const;  
  13.     void operator!=( scoped_ptr const& ) const;  
  14.   
  15. public:  
  16.   
  17.     typedef T element_type;  
  18.   
  19.     explicit scoped_ptr( T * p = 0 ): px( p ) // never throws  
  20.     {  
  21. #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
  22.         boost::sp_scalar_constructor_hook( px );  
  23. #endif  
  24.     }  
  25.   
  26. #ifndef BOOST_NO_AUTO_PTR  
  27.   
  28.     explicit scoped_ptr( std::auto_ptr<T> p ): px( p.release() ) // never throws  
  29.     {  
  30. #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
  31.         boost::sp_scalar_constructor_hook( px );  
  32. #endif  
  33.     }  
  34.   
  35. #endif  
  36.   
  37.     ~scoped_ptr() // never throws  
  38.     {  
  39. #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
  40.         boost::sp_scalar_destructor_hook( px );  
  41. #endif  
  42.         boost::checked_delete( px );  
  43.     }  
[cpp]  view plain copy
  1. 。。。。。   
[cpp]  view plain copy
  1. 摘抄与boost/smart_ptr/scoped_ptr.hpp中  


 scoped_ptr:是一个很类似auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除,但是scoped_ptr的所有权不能被转移,一旦scoped_ptr会获得了对象的管理权,你就无法再从它那里取回来。因为scoped_ptr同时将拷贝构造函数和赋值操作符都声明为私有的(只在本作用域里使用,不希望被转移)

[cpp]  view plain copy
  1. #include <boost/smart_ptr.hpp>  
  2. #include <iostream>  
  3. #include <cassert>  
  4. using namespace boost;  
  5. using namespace std;  
  6.   
  7. struct posix_file {             //一个示范的文件类  
  8.     posix_file(const char *file_name)  
  9.     { cout << "open file: " << file_name << endl; }  
  10.     ~posix_file() { cout << "close file" << endl; }  
  11. };  
  12.   
  13. int main(void)  
  14. {  
  15.     scoped_ptr<int> p(new int);       //一个int指针的scoped_ptr  
  16.     if(p)  
  17.     {  
  18.         *p=100;  
  19.         cout << *p << endl;  
  20.     }  
  21.     p.reset();          //reset()置空scoped_ptr  
  22.     assert(p==0);  
  23.     if(!p)  
  24.     {  
  25.         cout << "scoped_ptr==null" << endl;  
  26.     }  
  27.     scoped_ptr<posix_file> fp(new posix_file("/tmp/a.txt"));  
  28.       
  29.     auto_ptr<int> ap(new int(10));        //一个int的自动指针  
  30.     scoped_ptr<int> sp(ap);  
  31.     assert(ap.get() == 0);      //原auto_ptr不再拥有指针  
  32.   
  33.     ap.reset(new int(20));  
  34.     cout << *ap << "," << *sp << endl;  
  35.   
  36.     auto_ptr<int> ap2;  
  37.     ap2=ap;     //ap2从ap获得原始指针,发生所有权转移  
  38.     assert(ap.get()==0);  
  39.     //scoped_ptr<int> sp2;  
  40.     //sp2=sp;   //赋值操作错误  
  41.     return 0;  
  42. }  
(摘抄于深入C++“准标准库”)

scoped_array

类部分摘要
[cpp]  view plain copy
  1. template<class T> class scoped_array // noncopyable  
  2. {  
  3. private:  
  4.   
  5.     T * px;  
  6.   
  7.     scoped_array(scoped_array const &);  
  8.     scoped_array & operator=(scoped_array const &);  
  9.   
  10.     typedef scoped_array<T> this_type;  
  11.   
  12.     void operator==( scoped_array const& ) const;  
  13.     void operator!=( scoped_array const& ) const;  
  14.   
  15. public:  
  16.   
  17.     typedef T element_type;  
  18.   
  19.     explicit scoped_array( T * p = 0 ) : px( p ) // never throws  
  20.     {  
  21. #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
  22.         boost::sp_array_constructor_hook( px );  
  23. #endif  
  24.     }  
  25.   
  26.     ~scoped_array() // never throws  
  27.     {  
  28. #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
  29.         boost::sp_array_destructor_hook( px );  
  30. #endif  
  31.         boost::checked_array_delete( px );  
  32.     }  
[cpp]  view plain copy
  1. 。。。。  

scoped_array,它包装了new[]操作符在堆上分配的动态数组,为动态数组提供了一个代理,保证可以正确的释放内存

主要特点:构造函数接收的指针p必须是new[]的结果,而不是new表达式的结果
没有* ->操作符重载,因为scoped_array持有的不是一个普通的指针
析构函数必须使用delete[] 释放资源,而不是delete
提供operator[]操作符重载,可以像普通数组一样使用下标访问元素
没有begin,end等类似容器的迭代器操作函数

用法
[cpp]  view plain copy
  1. #include <boost/smart_ptr.hpp>  
  2. using namespace boost;  
  3. using namespace std;  
  4.   
  5. int main(void)  
  6. {  
  7.     int *arr = new int[100];  
  8.     scoped_array<int> sa(arr);  
  9.   
  10.     //fill_n(&sa[0], 100, 5);       //用标准库函数赋值  
  11.     fill(&sa[0], &sa[99], 5);  
  12.     sa[10] = sa[20]+sa[30];         //只能用operator[]来访问数组元素  
  13.     cout << sa[10] << endl;  
  14.     //cout << *(sa+20) << endl;         //没有* ->运算符  
  15.     return 0;  
  16. }  

shared_ptr

类部分摘要:

[cpp]  view plain copy
  1. template<class T> class shared_ptr  
  2. {  
  3. private:  
  4.   
  5.     // Borland 5.5.1 specific workaround  
  6.     typedef shared_ptr<T> this_type;  
  7.   
  8. public:  
  9.   
  10.     typedef T element_type;  
  11.     typedef T value_type;  
  12.     typedef T * pointer;  
  13.     typedef typename boost::detail::shared_ptr_traits<T>::reference reference;  
  14.   
  15.     shared_ptr(): px(0), pn() // never throws in 1.30+  
  16.     {  
  17.     }  
  18.   
  19.     template<class Y>  
  20.     explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete  
  21.     {  
  22.         boost::detail::sp_enable_shared_from_this( this, p, p );  
  23.     }  
  24.   
  25.     //  
  26.     // Requirements: D's copy constructor must not throw  
  27.     //  
  28.     // shared_ptr will release p by calling d(p)  
  29.     //  
  30.   
  31.     template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)  
  32.     {  
  33.         boost::detail::sp_enable_shared_from_this( this, p, p );  
  34.     }  
  35.   
  36.     // As above, but with allocator. A's copy constructor shall not throw.  
  37.   
  38.     template<class Y, class D, class A> shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a )  
  39.     {  
  40.         boost::detail::sp_enable_shared_from_this( this, p, p );  
  41.     }  


更像‘智能指针“,与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它的实现是引用计数型的智能指针,可以被自由的拷贝和复制,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。share_ptr也可以安全的放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷
用法
[cpp]  view plain copy
  1. class shared  
  2. {  
  3. public:  
  4.     shared(shared_ptr<int> p_) : p(p_) {} //构造函数初始化成员变量  
  5.     void print()  
  6.     {  
  7.         cout << "count: " << p.use_count() << "v = " << *p << endl;  
  8.     }  
  9. private:  
  10.     shared_ptr<int> p;          
  11. };  
  12.   
  13. void print_func(shared_ptr<int> p)  
  14. {  
  15.     cout << "count: " << p.use_count() << "v = " << *p << endl;  
  16. }  
  17.   
  18. int main(void)  
  19. {  
  20.     shared_ptr<int> p(new int(10));     
  21.     shared s1(p), s2(p);  
  22.       
  23.     s1.print();  
  24.     s2.print();  
  25.   
  26.     *p=20;  
  27.     print_func(p);  
  28.     s1.print();   
  29.     return 0;  
  30. }  

用于标准容器
[cpp]  view plain copy
  1. int main(void)  
  2. {  
  3.     typedef vector<shared_ptr<int> > vs;  
  4.     vs v(10);  
  5.   
  6.     int i=10;  
  7.     for (vs::iterator pos=v.begin(); pos!=v.end(); pos++)  
  8.     {  
  9.         *pos = make_shared<int>(++i);  
  10.         cout << *(*pos) << " ";  
  11.     }  
  12.     cout << endl;  
  13.   
  14.     shared_ptr<int> p = v[9];  
  15.     *p = 100;  
  16.     cout << *v[9] << endl;  
  17.     return 0;  
  18. }  

你可能感兴趣的:(Boost学习)