您的位置:首页 > 其它

智能指针:boost学习

2007-11-23 11:08 288 查看
前段时间,由于需要,在项目中使用了boost。boost提供了简洁实用的封装。可以使得我们在使用的时候不必关注其内部的实现方法。但是,作为c++程序员,最大的爱好就是学习了了解技术的细节本身。

所以,我抽取了一些时间学习了boost的部分功能实现。

这里先贴出一个关于智能指针的实现原理。

/// 本程序模拟boost::share_ptr的简单效果
/// 作者:kelvin
/// 日期:2007-11-16
/// 缺陷:该代码没有考虑在多线程下的应用,多线程下,主要需要控制记数的增加或者减少的互斥性.
/// 如果在windows下使用,可以使用简单的一个方法实现线程安全,代码注释掉了。
/// 这里的代码没有很细致的参考boost,仅仅从一个理解的角度进行编写的。可能还有很多不足,谢谢大家指出.

#include <assert.h>
//#include <windows.h>

template<typename POINTERTYPE>
class kelvin_ptr
{
public:
int *m_pRef;
POINTERTYPE *m_pPtr;

public:
kelvin_ptr():m_pRef(NULL),m_pPtr(NULL) {}
virtual ~kelvin_ptr() { Release(); }

// 构造一个智能指针
template<typename POINTERTYPE>
explicit kelvin_ptr(POINTERTYPE *pPtr)
{
// 确认指针有效
assert(pPtr);

AddRef(NULL);
m_pPtr = pPtr;
}

// 重载拷贝构造,增加引用记数
kelvin_ptr(kelvin_ptr<POINTERTYPE> &obj)
{
AddRef(obj.m_pRef);
m_pPtr = obj.m_pPtr;
}

// 重载赋值操作,使得可以对智能指针之间赋值
const kelvin_ptr<POINTERTYPE>& operator=(kelvin_ptr<POINTERTYPE> &obj)
{
// 首先要减少以前的对象的引用记数,然后在指向新的指针。
Release();

AddRef(obj.m_pRef);
m_pPtr = obj.m_pPtr;

return *this;
}

// 重载*运算符
POINTERTYPE& operator*()
{
assert(m_pPtr);
return *m_pPtr;
}

// 重载->运算符
POINTERTYPE* operator->()
{
assert(m_pPtr);
return m_pPtr;
}

private:
// 增加引用记数
void AddRef(int *pRef)
{
if (pRef == NULL)
{
m_pRef = new int;
*m_pRef = 0;
}
else
{
m_pRef = pRef;
}

(*m_pRef)++;
//InterlockedIncrement((LONG*)m_pRef);
}

// 减少引用记数
void Release()
{
if (m_pRef != NULL)
{
(*m_pRef)--;
//InterlockedDecrement((LONG*)m_pRef);

if ( (*m_pRef) == 0)
{
if (m_pPtr != NULL)
{
delete m_pPtr;
m_pPtr = NULL;
}

delete m_pRef;
m_pRef = NULL;
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: