自己写的智能指针源码
//
-------------------------------------------------
//
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
相关资源:数据结构—成绩单生成器
转载请注明原文地址: https://win8.8miu.com/read-29523.html