自己写的智能指针源码

it2022-05-05  40

自己写的智能指针源码 // ------------------------------------------------- //                     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 //_DEBUGpublic:#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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/len3d/archive/2005/09/11/234612.html

相关资源:数据结构—成绩单生成器

最新回复(0)