C++ 智能指针的使用

测试环境: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;
}

不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。

C++ 智能指针的使用

时间: 2024-11-05 22:38:07

C++ 智能指针的使用的相关文章

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)

写了很多篇关于vector的博客,其实vector很便捷,也很简单.但是很多易错的问题都是vector中的元素为智能指针所引起的.所以决定开始写一写关于智能指针的故事,尤其是unique_ptr指针的故事. 这是个开始,就让我们使用std::unique_ptr代替new operator吧! 还是用程序说话: #include<iostream> int main() { while (true) int *x = new int; } 看下任务管理器中的内存: 此时使用智能指针unique

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

boost智能指针使用

#include <iostream> #include <tr1/memory> #include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1 #include <boost/scoped_array.hpp> //scored_array也不属于tr1 #include <boost/shared_array.hpp> //shared_array也不属于tr1 class CTest { publi

webkit智能指针 - RefPtr, PassRefPtr

历史 2005年之前,Webkit中很多对象都采用引用计数的方式.它们通过继承RefCounted]类模板来实现这种模式.RefCounted主要是实现了ref()和deref()两个函数.在需要引用对象时要调用ref()增加引用计数,在不再需要对象时,要调用deref()函数减少引用计数.ref()和deref()需要成对出现.这和使用new/delete一样,多调用.少调用.没调用的问题总是时有发生.如果能由编译器自动完成ref, deref的调用,C/C++编程的bug至少也可以减少一半以

智能指针tr1::shared_ptr、boost::shared_ptr使用

对于tr1::shared_ptr在安装vs同时会自带安装,但是版本较低的不存在.而boost作为tr1的实现品,包含 "Algorithms Broken Compiler Workarounds Concurrent Programming Containers Correctness and Testing Data Structures Domain Specific Function Objects and Higher-order Programming Generic Progra

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++之智能指针20170920

/******************************************************************************************************************/ 一.C++智能指针_自己实现智能指针 1.使用局部变量结合new的方式,防止new导致的内存泄漏 class sp { private: Person *p; public: sp() : p(0) {}//表明sp的构造函数 继承person的无参构造函数 sp(

智能指针简介

智能指针用于解决常规指针所带来的内存泄露.重复释放.野指针等内存问题.智能指针基于这样的事实得以发挥作用:定义在栈中的智能指针,当超出其作用域时,会自动调用它的析构函数,从而可以释放其关联的内存资源. 之前C++标准库中定义的智能指针std::auto_ptr<T>,因其设计存在缺陷,所以已不再推荐使用.C++11引入了新的智能指针:unique_ptr.shared_ptr和weak_ptr. 一:unique_ptr unique_ptr类似于auto_ptr.两个unique_ptr实例

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使