Boost - shared_ptr
2013-04-08 09:39
246 查看
版权声明:对于本博客所有原创文章,允许个人、教育和非商业目的使用,但务必保证文章的完整性且不作任何修改地以超链接形式注明原始作者、出处及本声明。
博客地址:http://blog.csdn.net/shuxiao9058
原始作者:季亚
shared_ptr包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被地拷贝和赋值(包括流对象std::ifstream),在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。(摘自《Boost程序库完全开发指南:深入C++“准”标准库(修订版)》 p.69)
下面是一个shared_ptr对流对象操作的一个例子:
图1 运行结果
备注:通过使用文件流指针(如std::ifstream *ifpFStream)一样可以在不同函数之间进行传递,而且更容易理解,只不过不要忘记销毁该文件流对象。
博客地址:http://blog.csdn.net/shuxiao9058
原始作者:季亚
shared_ptr包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被地拷贝和赋值(包括流对象std::ifstream),在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。(摘自《Boost程序库完全开发指南:深入C++“准”标准库(修订版)》 p.69)
下面是一个shared_ptr对流对象操作的一个例子:
#include <iostream> #include <fstream> #include <string> #include <boost/shared_ptr.hpp> struct demo_class { public: demo_class( boost::shared_ptr<std::ifstream> sp ) { m_sp = sp; // 将其赋给成员m_sp std::cout << "ctor: "; std::cout << m_sp.use_count() << std::endl; } ~demo_class() { std::cout << "dtor: "; std::cout << m_sp.use_count() << std::endl; } public: void Read( ) { char line[100] = {0}; std::cout << "----------------------------------优美的分隔线----------------------------------" << std::endl; while( m_sp->getline( line, 100 ) ) { std::cout << line << std::endl; } std::cout << "----------------------------------优美的分隔线----------------------------------" << std::endl; } private: boost::shared_ptr<std::ifstream> m_sp; }; int main( int argc, char **argv ) { if ( argc != 2 ) { return -1; } std::string filename( argv[1] ); std::ifstream in( filename, std::ios::in ) ; boost::shared_ptr<std::ifstream> sp( new std::ifstream( filename ) ); std::cout << "sp.use_count(): " << sp.use_count() << std::endl; demo_class *dc = new demo_class( sp ); dc->Read(); std::cout << "before dtor: " << sp.use_count() << std::endl; delete dc; // 删除demo_class对象,调用析构函数 std::cout << "after dtor: " << sp.use_count() << std::endl; }运行结果如图所示:
图1 运行结果
备注:通过使用文件流指针(如std::ifstream *ifpFStream)一样可以在不同函数之间进行传递,而且更容易理解,只不过不要忘记销毁该文件流对象。
相关文章推荐
- boost 库的 shared_ptr
- boost::shared_ptr 的作为参数传递,以及构造细节!
- boost::shared_ptr shared_from_this
- Boost智能指针——shared_ptr
- boost中的shared_ptr
- Boost.smart_ptr.shared_ptr--2
- 一步一步写STL:定制boost::shared_ptr
- Boost智能指针——shared_ptr
- boost之shared_ptr,weak_ptr计数
- boost>shared_ptr
- boost shared_ptr实现浅析
- ./include/caffe/common.hpp:4:32: fatal error: boost/shared_ptr.hpp: 没有那个文件或目录
- 浅析boost之智能指针—shared_ptr
- (笔记)为何boost中boost::shared_ptr 循环引用会导致引用计数机制失效
- boost shared_ptr 总结
- boost::intrusive_ptr VS boost::shared_ptr
- Boost源码学习---shared_ptr.hpp
- shared_ptr weak_ptr boost 内存管理
- 使用boost::shared_ptr的教训
- boost::shared_ptr的多线程使用陷阱