sharePtr

#include <iostream>
#include <boost/shared_ptr.hpp>
class Test
{
public:
    ~Test()
    {
        std::cout << "Test Destructor." << std::endl;
    }
    //获取指向当前对象的指针
    boost::shared_ptr<Test> GetObject()
    {
        boost::shared_ptr<Test> pTest(this);
        return pTest;
    }
};
int main(int argc, char *argv[])
{
    {
        boost::shared_ptr<Test> p( new Test( ));

        boost::shared_ptr<Test> q(p->GetObject());

    }
    return 0;
}

输出:

Test Destructor.
Test Destructor.

上面的Test只new了一次,但是析构函数调用2次。分析:

首先生成了一个p对象,其中引用计数是1.

其次生成了一个q对象,其引用计数还是1.

当程序执行结束的时候,这个2个在堆栈上的对象都会释放掉,发现他们的引用计数都是1,然后就调用其保存的指针的对象的析构函数。

如果要传递出this出去,而且使得这个对象的引用随之增加,应该从sheare_from_this<>派生。

like this:

#include <iostream>
#include "boost/shared_ptr.hpp"
#include <boost/enable_shared_from_this.hpp>
class Test:public boost::enable_shared_from_this<Test>
{
public:
    ~Test()
    {
        std::cout << "Test Destructor." << std::endl;
    }
    //获取指向当前对象的指针
    boost::shared_ptr<Test> GetObject()
    {
        //boost::shared_ptr<Test> pTest(this);
        //return pTest;
        return this->shared_from_this();
    }

    void set(boost::shared_ptr<Test> t)
    {
        iValue = t->iValue;
    }

private:
    int iValue;
};
int main(int argc, char *argv[])
{
    {
        boost::shared_ptr<Test> p( new Test( ));

        boost::shared_ptr<Test> q(p->GetObject());

    }
    return 0;
}
shared_from_this:会使得本身的引用计数增加。
时间: 2024-08-06 17:34:31

sharePtr的相关文章

代理模式与Android

代理模式(Proxy) 一.   什么是代理模式 先来看看官方的说法,代理模式就是为其它对象提供一种代理,以控制对这个对象的訪问. 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不明确代理模式是什么,到底是用来做什么的. 事实上代理这个名词,对于我们来说事实上并不陌生,生活中有非常多关于代理的样例.比如校园代理等,就以校园代理来讲,这个校园代理就是为他相应的上司的作代理,而这个校园代理的工作就是訪问校园中的学生,比如对学生进行问卷之类的事.在这个样例中,学生就是官方说法中的其

【C++】智能指针的原始写法、scoped写法、shared写法

智能指针的三种常见写法: 一.最开始的原始写法,原始写法可以理解为指针转移的方法. template<typename T> class AutoPtr { public:     AutoPtr()         :_ptr(NULL)     {}     AutoPtr(T* ptr)         :_ptr(ptr)     {}     ~AutoPtr()     {         if (_ptr)         {             delete _ptr;  

Effective C++ Items

Item2:尽量以const,enum,inline替换#define 原因:1, #define ASPECT_RATIO 1.63 编译错误时产生魔数,应以const double Aspect_Ratio = 1.63替换 2, #define不能提供作用域,如某个类的常量 class GamePlayer{ private: static const int = 1024; int scores[NumTruns]; }; 上面的类也可以通过下面的enum实现, 但是此种实现更像是def

Chromium网页Layer Tree绘制过程分析

网页绘图表面创建完成之后,调度器就会请求绘制CC Layer Tree,这样网页在加载完成之后就能快速显示出来.通过CC Layer Tree可以依次找到Graphics Layer Tree.Render Layer Tree和Render Object Tree.有了Render Object Tree之后,就可以执行具体的绘制工作了.接下来我们就分析网页CC Layer Tree的绘制过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! CC La

Boost中的智能指针(转)

这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 定义 一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除.注意这个“其不需要的

C++智能指针使用总结

内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除.注意这个“其不需要的时候”, 这可不是一个精确的定义.这个不需要的时候可以指好多方面:局部变量退出函数作用域.类的对象被析构…….所以boost定义了多个不同的智能指针来管理不同的场景. shared

浅谈智能指针的历史包袱

我们学习C++的时候,想必都会听说一个叫智能指针的东西,在初听这个词的时候,我们都难免不被“智能”两个字所吸引,感觉它会比较高级,让人有种忍不住想用一把的冲动. 但事实上,它可能并没有我们所想的那样“智能”.好用,它本质上其实就是一个对象,它去接管了原指针所管理的资源.但这里单单用一个对象就想有“智能”的效果并没有那么容易.在智能指针发展的过程中,出现了Autor_ptr等多种版本的智能指针,但它们都确都或多或少有一些问题存在(相信早期的前辈们会深有感触).但智能指针的使用性却是不可否认的.它在

详解C++11智能指针

前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用. C++11智能指针介绍 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象.当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏.C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用.该引用计数的内存在堆上分配.当新

SmartPtr

// smart pointer implements #include <iostream> #include <memory> using namespace std; template<typename T> class SharePtr; template<typename T> class ResPtr { // manage res of memory private: T* res_p; // point res int use_num; //