有效解決記憶體洩露
一、你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。
不合理:
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 解析 檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致 的一致性變差...