- 浏览: 266168 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
daknife:
谢谢你的这篇文章,让我大概了解了select的一部分底层原理。 ...
Linux-2.6.25 select系统调用源码分析 -
gjlzjb:
非常有用,谢谢哈。另外问下,您是否用过Pheonix Syst ...
Why Map/Reduce? -
zhangyafei_kimi:
canbo 写道请问,我怎么生成安装包,提供给其它用户安装呢? ...
下载最新的Google Chrome源码并编译 -
canbo:
请问,我怎么生成安装包,提供给其它用户安装呢?
下载最新的Google Chrome源码并编译
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
发表评论
-
The Elements of Programing Style
2009-08-09 18:26 1275把代码写清楚,别耍小聪明。 想干什么,讲的简单点、直接点。 只 ... -
6个变态的C语言Hello World程序
2009-06-01 09:37 807转载自:http://cocre.com/?p=914 下面 ... -
在VS2005中使用IBM Purify的注意事项
2009-05-12 12:24 4005Rational Purify 使用及分析实例可以见这里htt ... -
boost.pool源码整理和使用说明
2007-07-22 13:49 270Source #ifndef __KIMI_BOOST_PO ... -
一个STL风格的动态二维数组
2007-07-22 18:05 1535#ifndef __KIMI_BOOST_ARRAY2#def ... -
boost.any源码整理和使用说明
2007-08-24 22:44 2108Source #include <algorithm& ... -
boost.array源码整理和使用说明
2007-08-24 22:45 1323Source #include <cstddef> ... -
boost.BOOST_STATIC_ASSERT源码整理和使用说明
2007-08-24 22:49 1370Source #include <boost/conf ... -
boost.lexical_cast源码整理和使用说明
2007-08-24 22:55 1551Source #include <cstddef> ... -
编译期判断类的继承性
2007-08-24 23:00 1114介绍一个雕虫小技:编译期判断类的继承性。具体来说就是类型U是否 ... -
boost.type_traits源码整理和使用说明(1)
2007-08-28 01:35 2088Introduction The Boost type-tr ... -
泛型快速排序
2007-08-28 03:20 947Source #ifndef kimi_quicksort ... -
C++ Meta Programming 和 Boost MPL(1)
2007-08-30 23:01 1609本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(2)
2007-08-30 23:02 1541本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(3)
2007-08-30 23:06 1549本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(4)
2007-08-30 23:07 1719本系列全部转载自kuibyshev.bokee.com ... -
泛型归并排序
2007-09-18 00:23 1219#define SENTINEL_CARD (-1) # ... -
泛型插入排序
2007-09-18 00:25 1215#pragma once #include <iter ... -
boost.tuple源码整理和使用说明
2007-10-07 23:13 1620Introduction A tuple (or n-tup ... -
才发现VC中也可以检测内存泄漏
2009-03-30 14:54 1385#include <stdio.h> ...
相关推荐
1. **智能指针**:Boost提供了一套完整的智能指针解决方案,如`boost::shared_ptr`、`boost::weak_ptr`和`boost::unique_ptr`,它们可以有效管理对象生命周期,避免内存泄漏。 2. **多线程支持**:Boost.Thread库...
Boost提供了各种各样的功能,如智能指针(`shared_ptr`, `unique_ptr`)、函数对象绑定(`bind`)、正则表达式、多线程支持(`thread`)、文件系统操作(`filesystem`)、日期时间处理(`date_time`)等。...
其次,Boost库中的智能指针(如boost::shared_ptr和boost::unique_ptr)在C++11标准中被采纳,成为std::shared_ptr和std::unique_ptr。这些智能指针管理对象生命周期,避免内存泄漏,提高了代码的安全性。在boost_1_...
这个模块允许我们创建和管理包含智能指针(如`boost::shared_ptr`或`boost::unique_ptr`)的容器,提供了类似STL容器的接口,但自动处理对象的生命周期管理。 `ptr_container`模块的核心理念是将内存管理和容器操作...
4. 智能指针:Boost库提供了多种智能指针类型,如Boost.Smart_ptr,包括shared_ptr、unique_ptr和weak_ptr,这些都是C++11中引入的标准智能指针的前身,帮助开发者更安全地管理内存。 5. 编程工具:Boost库包含了...
本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。 shared_ptr的线程安全性boost官方文档对...
这个压缩包中的"Boost智能指针学习(一)"可能包含了一系列逐步深入的示例,从基础用法到更复杂的场景,例如多线程环境下的使用,以及如何结合`shared_ptr`和`weak_ptr`来处理复杂的数据结构,如树或图。通过阅读和...
5. **智能指针和内存管理**:为了防止内存泄漏和提高代码的可靠性,Boost库提供了智能指针(如Boost_shared_ptr和Boost_unique_ptr),它们能自动管理对象的生命周期,减少内存管理的复杂性。 6. **异常安全编程**...
- **智能指针**(smart_ptr):包括shared_ptr、unique_ptr等,提供了一种安全的替代原始指针的方式,避免了内存泄漏和悬挂指针问题。 - **多线程**(thread):提供了线程管理、条件变量、互斥量等多线程编程所需的...
2. **智能指针**:Boost.SmartPtr库包含shared_ptr、unique_ptr和weak_ptr,它们是C++标准库中std::shared_ptr、std::unique_ptr和std::weak_ptr的前身,用于解决原始指针可能导致的内存泄漏问题。 3. **算法**:...
1. **智能指针**:如`shared_ptr`、`unique_ptr`和`weak_ptr`,它们提供了更安全的内存管理方式,防止了常见的悬挂指针问题。 2. **多线程**:Boost.Thread库提供了线程管理、同步原语(如互斥量、条件变量)以及...
1. **智能指针**(Smart Pointers):例如`shared_ptr`、`unique_ptr`和`weak_ptr`,它们提供了自动内存管理,防止了常见的悬挂指针问题。 2. **多线程**(Thread):提供了一组用于编写多线程程序的类和函数,简化...
6. **Boost.Smart_Ptr**:包含智能指针类型,如shared_ptr、unique_ptr和weak_ptr,帮助管理对象生命周期,防止内存泄漏。 7. **Boost.Python**:使得C++可以与Python语言无缝交互,实现C++扩展和Python调用C++函数...
1. **智能指针**(Smart Pointers):如shared_ptr、unique_ptr和weak_ptr,它们提供了比标准C++指针更安全的内存管理方式。 2. **算法**(Algorithms):提供了各种通用的算法,如排序、搜索和迭代器操作。 3. **...
1. **智能指针**(Smart Pointers):如shared_ptr、unique_ptr和weak_ptr,它们提供了一种更安全的内存管理方式,避免了传统指针可能导致的悬挂指针和内存泄漏问题。 2. **多线程支持**(Thread):Boost.Thread库...
3. **智能指针**:Boost库中的智能指针(如Boost.SmartPtr)是C++11标准库std::shared_ptr和std::unique_ptr的前身,它们解决了原始指针可能导致的内存泄漏问题,提供了自动的资源管理。 4. **多线程编程**:Boost....
- **智能指针**(Smart Pointers):如`shared_ptr`, `unique_ptr`等,提供了比原始指针更安全、更方便的内存管理方式。 - **算法库**:提供了一组高级的算法,如并行算法、迭代器算法等。 - **多线程库**(Thread)...
为了使用这个源码,你需要先解压`boost_1_72_0_src.tar.bz2`文件,通常可以使用`tar`命令进行解压。解压后,你可以按照Boost的构建指南进行配置和编译,以便在你的项目中使用这些库。对于C++开发者来说,理解和学习...
标题中的“boost源码.rar”指的是Boost库的1.65.1版本的源代码压缩包,这个版本在2017年发布,是一个稳定且广泛使用的版本。在Linux环境下,这些源代码可以被编译成二进制库,供开发者在他们的C++项目中引用和使用。...
1. **智能指针**:Boost库提供了`shared_ptr`、`unique_ptr`和`weak_ptr`,这些都是C++11标准库中智能指针的前身,用于管理动态分配的对象,自动处理内存释放,避免内存泄漏。 2. **线程管理**:Boost.Thread库提供...