测试环境: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()中运行。解释在代码中。
- <span style="font-size:18px;">#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为EnableSharedEx
- boost::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;
- }</span>
不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。