zoukankan      html  css  js  c++  java
  • 自己写的智能指针源码

    //-------------------------------------------------
    //                    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
  • 相关阅读:
    1039 Course List for Student (25 分)
    1054 The Dominant Color (20 分)
    1065 A+B and C (64bit) (20 分)
    1046 Shortest Distance (20 分)
    1124 Raffle for Weibo Followers (20 分)
    第四章——scrapy爬虫
    scrapy命令行与shell
    表的插入,更新,删除,索引
    JQuery前端开发实战笔记
    今日回顾数据库
  • 原文地址:https://www.cnblogs.com/len3d/p/234612.html
Copyright © 2011-2022 走看看