血淋淋的教訓(持續更新)

1. 慎用靜態變量,尤其是多線程的程序

2. 成員變量不要和參數命名成同一個名字否則很容易出現問題,尤其是在構造函數中使用init方法的時候

3. File類裏面的delete接口刪除文件一定要在所有的流關閉以後才能被刪除,否則刪不掉,不過deleteOnExit不收這個限制

4. double類型數據的計算,不能直接直接返回兩個double類型的計算,也不能直接把兩個double類型的計算結果賦值,否則會直接被取整,需要做一次強制類型轉換才行

    return (double) mReplayReso.y / mRecordReso.y;

5. 謹慎選擇循環,用for循環少用while循環,通過循環的方式去輪訓檢查某個類裏面的值的時候一定要加上一定的延時,要不然這個對CPU和內存的消耗無法預估

6. c語言中遞歸,共有變量靜態變量,反覆賦值的局部變量很容易導致sagmentation fault和memory leak    

    造成segment fault,產生core dump的可能原因
   1.內存訪問越界

      a) 由於使用錯誤的下標,導致數組訪問越界

      b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符

       c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。

    2 多線程程序使用了線程不安全的函數。

    3 多線程讀寫的數據未加鎖保護。對於會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成core dump

    4 非法指針

       a) 使用空指針

       b) 隨意使用指針轉換。一個指向一段內存的指針,除非確定這段內存原先就分配爲某種結構或類型,或者這種結構或類型的數組,否則不要將它轉換爲這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是因爲如果這段內存的開始地址不是按照這種結構或類型對齊的,那麼訪問它時就很容易因爲bus error而core dump.

     5 堆棧溢出.不要使用大的局部變量(因爲局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

     6. window系統會分爲32位和64位的,不同的系統要加載不同的dll庫。在應用程序開發的時候可能會依賴於一些系統本身的庫,例如mfc庫,kernel32庫等等。爲了適配所有的PC,這些庫例如mfcu100要在代碼中自己加載。或複製到C:\Windows\System32\ 文件夾下,再“開始——運行”裏輸入" regsvr32 mfc100u.dll "

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章