C++ 智能指针的使用
来源:互联网 发布:受人冷落的网络词语 编辑:程序博客网 时间:2024/05/17 11:05
测试环境:win7, vs2012
如果未安装boost,请参考:http://blog.csdn.net/alex_my/article/details/17630685
涉及智能指针:shared_ptr, weak_ptr, scoped_ptr, auto_ptr
其它:enable_shared_from_this
总调用函数: testSmartPointer()
可以将其放在main()中运行。解释在代码中。
#include <string>#include <vector>#include <iostream>#include <boost/scoped_ptr.hpp>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>#include <boost/enable_shared_from_this.hpp>class Base{public:explicit Base(int a): m_a(a){}virtual ~Base(){}int GetA() const{return m_a;}private:int m_a;};class Derive : public Base{public:explicit Derive(int b): Base(2 * b), m_b(b){}virtual ~Derive(){}int GetB() const{return m_b;}private:int m_b;};class EnableShared{public:EnableShared(): m_e(3){}~EnableShared() {std::cout<< "EnableShared Destruction execute" << std::endl;}void ShowE(){boost::shared_ptr<EnableShared> p1(this);std::cout<< p1->m_e << std::endl;}private:int m_e;};class EnableSharedEx : public boost::enable_shared_from_this<EnableSharedEx>{public:EnableSharedEx(): m_e(3){}~EnableSharedEx() {std::cout<< "EnableSharedEx Destruction execute" << std::endl;}void ShowE(){//boost::shared_ptr<EnableSharedEx> p1(this);boost::shared_ptr<EnableSharedEx> p1 = shared_from_this();std::cout<< p1->m_e << std::endl;}private:int m_e;};static void testSharedPtr();static void testEnableSharedFromthis();static void testScopedPtr();static void testAutoPtr();void testSmartPointer(){// ------------- shared_ptr -------------testSharedPtr();// ------------- enable_shared_from_this -------------testEnableSharedFromthis();// ------------- scoped_ptr -------------testScopedPtr();// ------------- auto_ptr -------------testAutoPtr();// ------------- summary -------------// 1 auto_ptr会转移所有权,使原拥有者失效// 2 shared_ptr比起auto_ptr,不会转移所有权,而是增加引用计数// 3 scoped_ptr不允许复制// 4 weak_ptr起了类似于观察者的作用,不会对拥有者造成影响}void testSharedPtr(){// 1 使用boost::shared_ptr<Base> pa(new Base(2));std::cout<< "testSharedPtr" << pa->GetA() << std::endl;// 2 发生引用,此时pa2和pa指向同一个指针,观察计数器share_ptr::use_count_ 值从1变为2。boost::shared_ptr<Base> pa2 = pa;// 3 弱引用,计数器并仍然是2,不过weak_count_ 从1变成了2。boost::weak_ptr<Base> p3 = pa;}void testEnableSharedFromthis(){// 1 应用举例boost::shared_ptr<EnableShared> pe(new EnableShared);//pe->ShowE();// 2 注释说明// 编译可以通过,但是析构函数会执行两次,造成程序崩溃// shared_ptr的一个缺点,无法从this指针构造,无法像testSharedPtr中的引用例子一样。// 3 解决办法 enable_shared_from_this,改写EnableShared为EnableSharedExboost::shared_ptr<EnableSharedEx> pex(new EnableSharedEx);pex->ShowE();}void testScopedPtr(){// 1 应用举例、boost::scoped_ptr<Base> pb(new Base(2));std::cout << "testScopedPtr" << pb->GetA() << std::endl;// 2 引用,无法通过编译,原因:scope_ptr不允许复制// boost::scoped_ptr<Base> pb2 = pb;}void testAutoPtr(){// 1 应用举例,与shared_ptr相似std::auto_ptr<Base> pa(new Base(2));std::cout<< "testAutoPtr: " << pa->GetA() << std::endl;// 2 发生引用,与shared_ptr不同的地方在于pa编程空指针了。std::auto_ptr<Base> pax = pa;}
不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。
0 0
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- C++:指向数组的智能指针scoped_array组件的使用
- C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍
- C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍
- (C++)智能指针的模拟实现及使用
- 【C++】智能指针的实现
- [c++]智能指针的实现
- 智能指针 _com_ptr_t的使用
- 使用智能指针的危险
- C++ 智能指针的使用
- 智能指针auto_ptr的使用
- ADO智能指针的使用
- C++ 智能指针的使用
- c++智能指针的使用
- C++智能指针的使用
- keytool - 密钥和证书管理工具(三)
- sql动态行转列
- 谦卑的架构师
- 虚幻脚本预处理器
- PictureEx.cpp 和PictureEx.h文件源码
- C++ 智能指针的使用
- libevent
- ubuntu13.10无法使用vmvare8.0共享文件夹功能
- newlisp 抓取网页
- python 模块简介
- windows7系统笔记本设置成虚拟WiFi热点
- hdu1711Number Sequence
- paip.配置ef_unified_filter() failed ext_filter_module mod_ext_filter.so apache 错误解决
- Myeclipse SVN 修改用户名和密码