`
zhangyafei_kimi
  • 浏览: 265289 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

boost.shared_ptr源码整理和使用说明

 
阅读更多

Source

#pragma once

//shared_ptr的简单实现版本

//基于引用记数的智能指针

//它可以和stl容器完美的配合

namespace kimi_boost

{

template<class T>

class shared_ptr

{

public:

typedef T element_type;

typedef T value_type;

typedef T * pointer;

typedef T& reference;

typedef unsigned long size_type;

explicit shared_ptr(T* p=0) : px(p)

{

try { pn = new size_type(1); }

catch (...) { delete(p); throw; }

}

shared_ptr& operator= (T* p)

{

if(this->px == p) return *this;

dispose();

try { pn = new size_type(1); }

catch (...) { delete(p); throw; }

px=p;

return *this;

}

shared_ptr(const shared_ptr& r) throw(): px(r.px)

{

++*r.pn;

pn = r.pn;

}

shared_ptr& operator= (const shared_ptr& r) throw()

{

if(this == &r) return *this;

dispose();

px = r.px;

++*r.pn;

pn = r.pn;

return *this;

}

template<typename Y> friend class shared_ptr;

//为了让有继续关系的shared_ptr类型赋值或构造

template<typename Y>

shared_ptr(const shared_ptr<Y>& r)

{

px = r.px;

++*r.pn;

pn = r.pn; // shared_count::op= doesn't throw

}

template<typename Y>

shared_ptr& operator= (const shared_ptr<Y>& r)

{

dispose();

px = r.px;

++*r.pn;

pn = r.pn; // shared_count::op= doesn't throw

return *this;

}

template<typename Y>

shared_ptr(Y* py)

{

try { pn = new size_type(1); }

catch (...) { delete(py); throw; }

px=py;

}

template<typename Y>

shared_ptr& operator= (Y* py)

{

if(this->px == py) return *this;

dispose();

try { pn = new size_type(1); }

catch (...) { delete(py); throw; }

px=py;

return *this;

}

~shared_ptr() { dispose(); }

void reset(T* p=0)

{

if ( px == p ) return;

if (--*pn == 0)

{ delete(px); }

else

{ // allocate new reference

// counter

// fix: prevent leak if new throws

try { pn = new size_type; }

catch (...) {

// undo effect of —*pn above to

// meet effects guarantee

++*pn;

delete(p);

throw;

} // catch

} // allocate new reference counter

*pn = 1;

px = p;

} // reset

reference operator*() const throw(){ return *px; }

pointer operator->() const throw(){ return px; }

pointer get() const throw(){ return px; }

size_type use_count() const throw()//

{ return *pn; }

bool unique() const throw()//

{ return *pn == 1; }

private:

void dispose() throw()

{

if (--*pn == 0)

{ delete px; delete pn; }

}

T * px; // contained pointer

size_type* pn; // reference counter

}; // shared_ptr

template<typename A,typename B>

inline bool operator==(shared_ptr<A> const & l, shared_ptr<B> const & r)

{

return l.get() == r.get();

}

template<typename A,typename B>

inline bool operator!=(shared_ptr<A> const & l, shared_ptr<B> const & r)

{

return l.get() != r.get();

}

}//namespace kimi_boost

Test code

class A

{

public:

A(int _a=0):a(_a){}

~A(){}

protected:

int a;

};

class B : public A

{

public:

B(int _a=0):A(_a){}

~B(){}

};

void kimi_shared_ptr_test()

{

using namespace std;

using kimi_boost::shared_ptr;

shared_ptr<int> sp;

shared_ptr<int> sp2(new int(2));

shared_ptr<int> sp3(sp2);

shared_ptr<int> sp4;

shared_ptr<int> sp5;

sp=sp2;

sp4=new int(3);

sp.reset(new int(10000));

vector< shared_ptr<int> > vsp;

vsp.push_back(sp);

vsp.push_back(sp2);

vsp.push_back(sp3);

vsp.push_back(sp4);

vsp.push_back(sp5);

shared_ptr<A> spa(new A(2));

shared_ptr<B> spb(new B(3));

spa = spb;

shared_ptr<A> spa2(new B(2345));

cout<<(sp2==sp3)<<endl;

cout<<(spa==spb)<<endl;

}

Output

1

1

分享到:
评论

相关推荐

    boost_1_60_0.tar.gz

    1. **智能指针**:Boost提供了一套完整的智能指针解决方案,如`boost::shared_ptr`、`boost::weak_ptr`和`boost::unique_ptr`,它们可以有效管理对象生命周期,避免内存泄漏。 2. **多线程支持**:Boost.Thread库...

    boost_1_79_0源码安装包

    Boost提供了各种各样的功能,如智能指针(`shared_ptr`, `unique_ptr`)、函数对象绑定(`bind`)、正则表达式、多线程支持(`thread`)、文件系统操作(`filesystem`)、日期时间处理(`date_time`)等。...

    boost_1_53_0.tar.gz

    其次,Boost库中的智能指针(如boost::shared_ptr和boost::unique_ptr)在C++11标准中被采纳,成为std::shared_ptr和std::unique_ptr。这些智能指针管理对象生命周期,避免内存泄漏,提高了代码的安全性。在boost_1_...

    Boost.orgptr_container模块.zip

    这个模块允许我们创建和管理包含智能指针(如`boost::shared_ptr`或`boost::unique_ptr`)的容器,提供了类似STL容器的接口,但自动处理对象的生命周期管理。 `ptr_container`模块的核心理念是将内存管理和容器操作...

    boost_1_42 版本源代码

    4. 智能指针:Boost库提供了多种智能指针类型,如Boost.Smart_ptr,包括shared_ptr、unique_ptr和weak_ptr,这些都是C++11中引入的标准智能指针的前身,帮助开发者更安全地管理内存。 5. 编程工具:Boost库包含了...

    shared_ptr线程安全性全面分析

    本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。 shared_ptr的线程安全性boost官方文档对...

    Boost智能指针示例源码

    这个压缩包中的"Boost智能指针学习(一)"可能包含了一系列逐步深入的示例,从基础用法到更复杂的场景,例如多线程环境下的使用,以及如何结合`shared_ptr`和`weak_ptr`来处理复杂的数据结构,如树或图。通过阅读和...

    Boost_ClosedLoop_boost控制_boost闭环_boost闭环_Boost_boost双闭环_源码.zip

    5. **智能指针和内存管理**:为了防止内存泄漏和提高代码的可靠性,Boost库提供了智能指针(如Boost_shared_ptr和Boost_unique_ptr),它们能自动管理对象的生命周期,减少内存管理的复杂性。 6. **异常安全编程**...

    boost_1_43_0.tar.gz

    - **智能指针**(smart_ptr):包括shared_ptr、unique_ptr等,提供了一种安全的替代原始指针的方式,避免了内存泄漏和悬挂指针问题。 - **多线程**(thread):提供了线程管理、条件变量、互斥量等多线程编程所需的...

    upload_Boost_源码.zip

    2. **智能指针**:Boost.SmartPtr库包含shared_ptr、unique_ptr和weak_ptr,它们是C++标准库中std::shared_ptr、std::unique_ptr和std::weak_ptr的前身,用于解决原始指针可能导致的内存泄漏问题。 3. **算法**:...

    boost_1_59_0.7z

    1. **智能指针**:如`shared_ptr`、`unique_ptr`和`weak_ptr`,它们提供了更安全的内存管理方式,防止了常见的悬挂指针问题。 2. **多线程**:Boost.Thread库提供了线程管理、同步原语(如互斥量、条件变量)以及...

    GE.tar.gz_Boost

    1. **智能指针**(Smart Pointers):例如`shared_ptr`、`unique_ptr`和`weak_ptr`,它们提供了自动内存管理,防止了常见的悬挂指针问题。 2. **多线程**(Thread):提供了一组用于编写多线程程序的类和函数,简化...

    boost_1_53_0_beta1.tar.gz

    1. **智能指针**(Smart Pointers):如shared_ptr、unique_ptr和weak_ptr,它们提供了比标准C++指针更安全的内存管理方式。 2. **算法**(Algorithms):提供了各种通用的算法,如排序、搜索和迭代器操作。 3. **...

    BOOST源码1.53.0

    6. **Boost.Smart_Ptr**:包含智能指针类型,如shared_ptr、unique_ptr和weak_ptr,帮助管理对象生命周期,防止内存泄漏。 7. **Boost.Python**:使得C++可以与Python语言无缝交互,实现C++扩展和Python调用C++函数...

    boost_1_73_0编译好的静态库文件版本

    1. **智能指针**(Smart Pointers):如shared_ptr、unique_ptr和weak_ptr,它们提供了一种更安全的内存管理方式,避免了传统指针可能导致的悬挂指针和内存泄漏问题。 2. **多线程支持**(Thread):Boost.Thread库...

    boost编程.zip

    3. **智能指针**:Boost库中的智能指针(如Boost.SmartPtr)是C++11标准库std::shared_ptr和std::unique_ptr的前身,它们解决了原始指针可能导致的内存泄漏问题,提供了自动的资源管理。 4. **多线程编程**:Boost....

    boost_1_49_0

    - **智能指针**(Smart Pointers):如`shared_ptr`, `unique_ptr`等,提供了比原始指针更安全、更方便的内存管理方式。 - **算法库**:提供了一组高级的算法,如并行算法、迭代器算法等。 - **多线程库**(Thread)...

    boost_1_72_0_src.7z

    为了使用这个源码,你需要先解压`boost_1_72_0_src.tar.bz2`文件,通常可以使用`tar`命令进行解压。解压后,你可以按照Boost的构建指南进行配置和编译,以便在你的项目中使用这些库。对于C++开发者来说,理解和学习...

    boost源码.rar

    标题中的“boost源码.rar”指的是Boost库的1.65.1版本的源代码压缩包,这个版本在2017年发布,是一个稳定且广泛使用的版本。在Linux环境下,这些源代码可以被编译成二进制库,供开发者在他们的C++项目中引用和使用。...

    boost源码库

    1. **智能指针**:Boost库提供了`shared_ptr`、`unique_ptr`和`weak_ptr`,这些都是C++11标准库中智能指针的前身,用于管理动态分配的对象,自动处理内存释放,避免内存泄漏。 2. **线程管理**:Boost.Thread库提供...

Global site tag (gtag.js) - Google Analytics