C++高質(zhì)量編程點滴

字號:

一、你需要一個函數(shù)將一個數(shù)組賦值為等差數(shù)列,并將會在函數(shù)的外部使用它?! ?BR>    不合理: 
    int *GetArray( int n )
    {
     int *p = new int[n];
     for ( int i = 0; i < n; i++ )
     {
       p = i;
     }
     return p;
    } 
    合理: 
    void GetArray( int *p, int n )
    {
     for ( int i = 0; i < n; i++ )
     {
     p = i;
     }
    }
    解析:  
    檢查內(nèi)存泄露的辦法,就是檢查完全配對的申請和釋放,在函數(shù)中申請而在外部釋放,將導(dǎo)致代碼的一致性變差,難以維護(hù)。而且,你寫的函數(shù)不一定是你自己使用的,這樣的函數(shù)別人會不知道該怎么適當(dāng)?shù)氖褂?,如果它是一個DLL的導(dǎo)出函數(shù),并且你在不同的平臺下使用了,便會導(dǎo)致系統(tǒng)崩潰。的解決辦法就是在函數(shù)調(diào)用的外面將內(nèi)存申請好,函數(shù)只對數(shù)據(jù)進(jìn)行復(fù)制?! ?BR>    二、你需要寫一個類來為你管理一個指針,這個類將封裝對指針的申請內(nèi)存、釋放和其它一些基本操作?!?BR>    不合理: 
    class A
    {
    public:
     A( void ) {}
     ~A( void ) { delete []m_pPtr; }
     void Create( int n ){ m_pPtr = new int[n]; }
    private:
     int *m_pPtr;
    }; 
    合理:  
    class A
    {
    public:
     A( void ) : m_pPtr(0){}
     ~A( void ) { Clear(); }
     bool Create( int n ){ if ( m_pPtr ) return false; m_pPtr = new int[n]; return ture; }
     void Clear( void ) { delete []m_pPtr; m_pPtr = 0; }
    private:
     int *m_pPtr;
    };
    解析:  
    不合理的代碼就在于當(dāng)你重復(fù)調(diào)用Create的時候就會造成內(nèi)存泄露,解決的辦法就是在new之前判斷一下指針是否為0。要能夠有效的執(zhí)行這個判斷,則必須在構(gòu)造的時候?qū)χ羔樳M(jìn)行初始化,并為這個類添加一個Clear函數(shù)來釋放內(nèi)存?! ?BR>    三、接上題的Create函數(shù),你現(xiàn)在需要根據(jù)傳入的參數(shù)做一些比較復(fù)雜的算法操作,并對申請的數(shù)組賦值?! ?BR>    不合理: 
    bool Create(int *a, int n )
    {
     if ( m_pPtr )
     return false;
     m_pPtr = new int[n];
     for ( int i = 0; i < n; i++ )
     {
     m_pPtr = 3 / a;
     }
     return true;
    }