len3d

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
//-------------------------------------------------
//                    Smart Pointer
//-------------------------------------------------

#ifndef _SMART_POINTER_H
#define _SMART_POINTER_H

extern std::list<short>        ptrCounter;

template 
<class T>
class smartPtr
{
private:
    T            
*ptr;
    
short        *counter;
#ifdef _DEBUG
#define _DEBUG_FILE_NAME_LEN        32
#define _DEBUG_RECORD_LEN            32
    typedef 
struct __debug_record {
        
char    file[_DEBUG_FILE_NAME_LEN];
        
int        line;
    }
 debug_record;
public:
    debug_record    ptr_changed_rec[_DEBUG_RECORD_LEN];
    
int                ptr_changed_time;
#endif //_DEBUG
public:
#ifdef _DEBUG
    smartPtr(LPCSTR file 
= "Construction By Default",int line = __LINE__){
#else
    smartPtr()
{
#endif //_DEBUG
        ptr 
= new T;
        ptrCounter.push_back(
1);
        counter 
= &ptrCounter.back();
#ifdef _DEBUG
        memset(ptr_changed_rec,
0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
        strncpy(ptr_changed_rec[
0].file,file,_DEBUG_FILE_NAME_LEN);
        ptr_changed_rec[
0].line = line;
        ptr_changed_time 
= 1;
#endif //_DEBUG
    }

#ifdef _DEBUG
    smartPtr(
const T *np,LPCSTR file = "Construction By Pointer",int line = __LINE__){
#else
    smartPtr(
const T *np){
#endif //_DEBUG
        ptr 
= const_cast<T*> (np);
        ptrCounter.push_back(
1);
        counter 
= &ptrCounter.back();
#ifdef _DEBUG
        memset(ptr_changed_rec,
0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
        strncpy(ptr_changed_rec[
0].file,file,_DEBUG_FILE_NAME_LEN);
        ptr_changed_rec[
0].line = line;
        ptr_changed_time 
= 1;
#endif //_DEBUG
    }

    smartPtr(
const smartPtr<T> & np){
        ptr 
= np.ptr;
        counter 
= np.counter;
        (
*counter) ++;
#ifdef _DEBUG
        LPCSTR file 
= "Construction By Copying";int line = __LINE__;
        memset(ptr_changed_rec,
0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
        strncpy(ptr_changed_rec[
0].file,file,_DEBUG_FILE_NAME_LEN);
        ptr_changed_rec[
0].line = line;
        ptr_changed_time 
= 1;
#endif //_DEBUG
    }

    
void operator = (const smartPtr<T> & np){
        
if(counter != NULL){
            (
*counter) --;
            
if((*counter) <= 0)
                delete ptr;
        }

        ptr 
= np.ptr;
        counter 
= np.counter;
        (
*counter) ++;
#ifdef _DEBUG
        LPCSTR file 
= "Value Assignment";int line = __LINE__;
        strncpy(ptr_changed_rec[ptr_changed_time].file,file,_DEBUG_FILE_NAME_LEN);
        ptr_changed_rec[ptr_changed_time].line 
= line;
        ptr_changed_time 
++;
#endif //_DEBUG
    }

    
~smartPtr(){
        (
*counter) --;
        
if((*counter) <= 0)
            delete ptr;
    }

    T 
*operator->(){
        
return ptr;
    }

    T 
*real(){
        
return ptr;
    }

}
;

#endif //_SMART_POINTER_H
posted on 2005-09-11 20:31  Len3d  阅读(462)  评论(0编辑  收藏  举报