C 程式設計點滴

2021-04-02 05:34:09 字數 2252 閱讀 2945

有效解決記憶體洩露

一、你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。

不合理:

int *getarray( int n

return p;

}合理:

void getarray( int *p, int n

}解析:

檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致**的一致性變差,難以維護。

而且,你寫的函式不一定是你自己使用的,這樣的函式別人會不知道該怎麼適當的使用,如果它是乙個dll的匯出函式,並且你在不同的平台下使用了,便會導致系統崩潰。最好的解決辦法就是在函式呼叫的外面將記憶體申請好,函式只對資料進行複製。

二、你需要寫乙個類來為你管理乙個指標,這個類將封裝對指標的申請記憶體、釋放和其它一些基本操作。

不合理:

class a

~a( void

void create( int n

private:

int *m_pptr;

};合理:

class a

~a( void

bool create( int n

void clear( void

private:

int *m_pptr;

};解析:

不合理的**就在於當你重複呼叫create的時候就會造成記憶體洩露,解決的辦法就是在new之前判斷一下指標是否為0。要能夠有效的執行這個判斷,則必須在構造的時候對指標進行初始化,並為這個類新增乙個clear函式來釋放記憶體。

三、接上題的create函式,你現在需要根據傳入的引數做一些比較複雜的演算法操作,並對申請的陣列賦值。

不合理:

bool create(int *a, int n

return true;

}合理:

template

class auto_array

~auto_array()

void reset(_ty *pptr=0)}

_ty* release(void)

private:

auto_array(const auto_array&other){}

auto_array& operator=(const auto_array& other){}

_ty *m_ptr;

};bool a::create(int *a, int n

ptrguard .get()[i] = 3 / a[i];

}m_pptr = ptrguard.release();

return true;

}解析:

在迴圈中,當引數陣列a中的某乙個值為0時,將會產生除0異常,那麼,這將會導致你在上面為m_pptr申請的記憶體不能合理的釋放。為了解決這個問題,我們寫了乙個auto_array作為衛兵來看守企圖逃逸的指標。

在auto_array物件ptrguard析構的時候它會同時刪除附加在它身上的記憶體指標。我們首先用ptrguard來進行所有的指標操作,在確定操作完全結束的最後,把指標再賦給真正的變數,並使ptrguard放棄對該指標的附加,這樣我們就得到了乙個最安全的結果。

另外需要注意的是,c++的stl庫里本來有乙個和auto_array功能非常相似的模版類auto_ptr,但是它只支援單個物件的記憶體,不支援陣列,寫這樣乙個auto_array也是不得已而為之。

C 程式設計技巧點滴

1。什麼是預編譯標頭檔案 2.c memset memcpy 和strcpy 的區別 include memory.h memset用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為 或 0 例 char a 100 memset a,0 sizeof a memcpy用來做記...

C 高質量程式設計點滴

摘自 http www.sudu.cn info html edu c 20070103 236588.html 一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用他。不合理 int getarray int n return p 合理 void getarray int p,int...

高質量C 程式設計點滴

一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。不合理 int getarray int n return p 合理 void getarray int p,int n 解析 檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致 的一致性變差...