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
原创粉丝点击