摘自:http://www.sudu.cn/info/html/edu/c/20070103/236588.html
一、你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用他。
不合理:
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也是不得已而為之。
四、你需要開闢一段記憶體來存放和管理乙個4 x 4的矩陣,並單位化之。
不合理:
int amatrix[4][4];
for ( int i = 0; i < 4; i++ )
else }
} 合理:
int amatrix[4 * 4];
for ( int i = 0; i < 4; i++ )
else }
}
解析:
在所有時候都要避免使用多維陣列,陣列維數的增加,相應的程式複雜度將會以幾何級數的方式增加,也更加的難於理解。
五、你需要對上面那個矩陣賦值,使他從左上角向右下角按先縱後橫的順序給他賦值
不合理:
for( int i = 0; i < 4; i++ ) }
合理:
for( int i = 0; i < 4; i++ ) }
解析:
盡量確保順序的訪問陣列的每乙個元素。由於視窗系統記憶體的管理模式,記憶體是分頁管理的。順序訪問陣列能基本確保頁面不會來回轉換,從而減少了頁失效的數量,提高了程式的整體效能。這種效能的提公升對於大的陣列尤為明顯。
六、你需要用3個float值來表示乙個三維的點,並要寫乙個函式對乙個三維點的陣列進行計算賦值。
不合理:
void foo( float *ppoints[3] )
; int ncount = (int)_msize( ppoints );
for ( int i = 0; i < ncount; i++ ) }
合理:
struct point3
; void foo( point3 *ppoints, int ncount )
; for ( int i = 0; i < ncount; i++ ) }
解析:
有兩點,一,不要使用_msize對陣列的大小進行測定,_msize只能對使用malloc或calloc申請的記憶體進行大小測定,對於其他的如new或一些api,將會導致程式的崩潰。在設計此類需要傳入陣列的函式時,別忘了把陣列的元素數量也做為引數一併傳入,哪怕他是固定的,這將是個良好的習慣。二,對於float[3]這種型別,盡量避免直接使用他,最佳的辦法就是用struct對其進行簡單的封裝,在複製的時候直接使用「=」就能進行準確的按位賦值了。
七、你有乙個函式的定義,在這個函式中會new乙個比較大的物件data,並在計算後將他刪除。但這個函式將被頻繁呼叫。
不合理:
void foo( void )
合理:
char buf[sizeof(data)];
void foo( void )
解析:
new(buf) type;是定位的new語法,他不會真正的分配記憶體,而是簡單的在指定的已分配的記憶體起點上劃分出一段和型別大小匹配的空間,並直接在這段記憶體上對該型別進行構造物件,並返回物件的指標。由於他沒有真正的分配記憶體空間,因此他的效率是非常高的,在類似於上述例程中,頻繁申請和釋放乙個大物件的操作,定位的new能帶來非常大的效率提公升。
高質量C 程式設計點滴
一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。不合理 int getarray int n return p 合理 void getarray int p,int n 解析 檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致 的一致性變差...
高質量程式設計 筆記
1.高質量軟體開發之道 1.提高軟體質量的基本方法 2.軟體質量屬性 3.質量 生成率和成本 4.軟體過程改進 5.高質量軟體開發的基本方法 2.程式的基本概念 1.程式語言 一套規範的集合,主要包括語言使用字符集 資料型別集合 運算子集合 關鍵字集合 指令集合 語法規則 對特定構造的支援 函式 繼...
高質量程式設計C C
一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...