智能指针: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;
}
}
}
};
所以,我抽取了一些时间学习了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;
}
}
}
};
相关文章推荐
- 一起学习C,C++__boost--智能指针(3)
- Boost学习笔记-智能指针
- Boost学习笔记-智能指针
- 学习笔记四:boost智能指针:scoped_ptr和shared_ptr
- 现代C++学习笔记之一入门篇:智能指针(C++ 11)
- boost::scoped_ptr智能指针
- 【STL学习】智能指针之shared_ptr
- 智能指针学习
- 学习笔记之智能指针简单理解
- 智能指针学习总结
- 【原/转】【boost】智能指针使用规则以及介绍
- 【Boost】boost库中智能指针——intrusive_ptr
- C++11 下使用 Boost.Serialization 库实现智能指针的序列化
- C++学习之auto_ptr智能指针
- Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)
- boost::shared_ptr 智能指针在项目中的使用
- boost::share_ptr智能指针使用示例
- 智能指针学习
- c++11学习笔记之智能指针
- c++ 11学习笔记--智能指针