简单的智能指针
TO 蕾:实际上智能指针,不定参,模板这些东西没有你想象中的那么难……简化一下是否清晰很多:)一起慢慢加油吧。
//=======SmartPiont.h=======
//-----------------------------------------------------------------------------
// Name: FKSmartPointer
// Author: FreeKnightDuzhi
// LastModified: 2008_10_12
// Description: 智能指针是预防内存泄露的好东西,因为它会自动的在指针被释放时将其指向的内存空间释放。
// 这里将它实现为模版类,在它出了自己的生命空间后它会自动释放对象类。当一个智能指针被
// 分配了两次内存时候它也会自动的释放第一次分配的内存空间。
// 这里:ISmartPointer基类是一个仅支持基本类型的智能指针,且不支持 "->" 操作符。
// 但CSmartPointer可以支持非基本类型,且重载了 "->" 操作符。
//-----------------------------------------------------------------------------
#pragma once
template < typename T >
class ISmartPointer
{
public:
// 构造函数
ISmartPointer( T* p_pPtr = NULL )
: m_pPtr ( p_pPtr )
{
}
// 析构函数
virtual ~ISmartPointer( )
{
if ( NULL != m_pPtr )
{
delete m_pPtr;
}
m_pPtr = NULL;
}
// 重载指针符
T& operator* () const
{
return *m_pPtr;
}
// 重载普通赋值函数,此次重载是将普通指针转换为智能指针
T* operator= ( T* p_pPtr )
{
// 若是第二次分配空间,则删除第一次的空间分配
if ( m_pPtr != NULL )
{
delete m_pPtr;
}
m_pPtr = p_pPtr;
return m_pPtr;
}
private:
// 拷贝构造函数:不希望外部调用
ISmartPointer( ISmartPointer< T >& p_Other )
{
}
protected:
T* m_pPtr;
};
template < typename T >
class CSmartPointer : public ISmartPointer < T >
{
public:
// 构造函数
CSmartPointer( T* p_pPtr = NULL )
: ISmartPointer < T > ( p_pPtr )
{
}
// 重载 = 号
T* operator= ( T* p_pPtr )
{
return ISmartPointer< T >::operator = ( p_pPtr );
}
CSmartPointer< T >& operator= ( CSmartPointer< T >& p_Other )
{
return *this;
}
// 重载 -> 号
T* operator->() const
{
return m_pPtr;
}
private:
// 拷贝构造函数:不希望外部调用
CSmartPointer( CSmartPointer< T >& p_Other )
{
}
};
//=======TestSmartPiont.cpp=======
#include <iostream>
using namespace std;
#include "smartPointer.h"
// 测试类..
class CTestClass
{
public:
int m_nSomeInt;
float m_fSomeFloat;
};
void main()
{
ISmartPointer< int > pIntPtr;
pIntPtr = new int;
*pIntPtr = 100;
cout << *pIntPtr << endl;
CSmartPointer< CTestClass > pClassPtr1;
pClassPtr1 = new CTestClass;
pClassPtr1->m_fSomeFloat = 1.002;
cout << (*pClassPtr1).m_fSomeFloat << endl;
cout << pClassPtr1->m_fSomeFloat << endl;
getchar();
}