测试环境: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 <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; }
不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。