std::tr1::shared_ptr内存使用

shared_ptr定义如下:

template<typename _Tp>
class shared_ptr
{private:
    _Tp*         _M_ptr;         // contained pointer
    shared_count _M_refcount;    // reference counter
};

shared_count定义如下:

class shared_count
{
public:
    template<typename _Ptr, typename _Deleter>
    shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
    {
        _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter>(__p, __d);
    }
private:
    _Sp_counted_base* _M_pi;
};

_Sp_counted_base定义如下:

class _Sp_counted_base
{
private:
    _Atomic_word _M_use_count;        // #shared
    _Atomic_word _M_weak_count;       // #weak + (#shared != 0)
    __gnu_cxx::mutex_type _M_mutex;
};

template<typename _Ptr, typename _Deleter>
class _Sp_counted_base_impl : public _Sp_counted_base
{
private:
    _Ptr     _M_ptr; // copy constructor must not throw
    _Deleter _M_del; // copy constructor must not throw
};

sizeof(_Sp_counted_base) = 48,在_Sp_counted_base_Impl中,_Ptr是对象指针,而_M_del结构如下:

template<typename _Tp>
struct _Sp_deleter
{
    typedef void result_type;
    typedef _Tp* argument_type;

    void operator()(_Tp* p) const
    {
        delete p;
    }
};

因此shared_ptr对象的体积为72:

时间: 2024-10-29 19:07:39

std::tr1::shared_ptr内存使用的相关文章

C++细节学习之智能指针auto_ptr和tr1::shared_ptr

为什么要用智能指针? 我们知道在C++中,资源管理是个头疼的问题.资源管理最常做的就是内存管理.而指针用起来如果忘记归还,就会导致内存泄露. 比如: class Oneclass{}; int func(){ Oneclass* one=new Oneclass; if(!one)return 1; delete one; return 0; } 可见,上面代码中,我们可以发现delete并没什么卵用,函数没有执行到delete,而是直接返回了1:最好的办法就是不用指针,使用对象来管理资源,因为

智能指针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++ std::tr1::function使用

1. 介绍 function 是一种通用.多态的函数封装.std::function 的实例可以对任何可以调用的 目标 进行存储.复制.和调用操作,这些目标包括函数.lambda 表达式.绑定表达式.以及其它函数对象等.(c++11起的版本可用) function(和bind一样)可以实现类似函数指针的功能,却比函数指针更加灵活(体现在占位符上面),尤其是在很多成员调用同一个函数(仅仅是参数类型不同)的时候比较方便. 特点: 可以作为函数和成员函数. 可做回调函数,取代函数指针. 可作为函数的参

std::tr1::function和bind组件

C++中std::tr1::function和bind 组件的使用 在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数时.可以参考Scott Meyers. <<Effective C++ (3rd Edition)>>. Item 35.下面具体说明其使用方法. 一.指向全局函数或静态成员函数时 因为在本质上讲全局函数和静态成员函

std::tr1::function std::tr1::bind

在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时.可以参考Scott Meyers. <<Effective C++ (3rd Edition)>>. Item 35.下面具体说明其使用方法. 一.指向全局函数或静态成员函数时 因为在本质上讲全局函数和静态成员函数没有区 别,使用方法上除了静态成员函数在引用时要在前面加域作用符

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象,共同使用一块内存: 1.关于string的内存共享问题: 通常,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存. 因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返

【转】标准C++类std::string的内存共享和Copy-On-Write技术

1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是"拖延战术",直到你非要做的时候才去做. 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变

VisualStudio下std::string的内存布局

主要成员 ? 1 2 3 4 5 6 7 8 union _Bxty     {   // storage for small buffer or pointer to larger one     _Elem _Buf[_BUF_SIZE];     _Elem *_Ptr;     } _Bx; size_type _Mysize;  // current length of string size_type _Myres;   // current storage reserved for

auto_ptr,shared_ptr 智能指针的使用

Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技术来保证资源在发生异常时也能被安全释放(“exception safety”).一个auto_ptr封装了一个指针,也可以被当作指针来使用.当其生命周期到了尽头,auto_ptr会自动释放指针.例如: #include<memory> using namespace std;  struct X