關於記憶體的一些bug (轉)
從記憶體管理方面來講,C#是個完美的天堂,你不用像在C++中那樣萬分小心的管理著你的記憶體;儘管如此,本人還是喜歡C++要多些,正如微軟稱C++為native程式碼 - C++對我來講,的確是要更native一些。
其實,很多時候,C++之於C#,就像手動擋之於自動擋。
閒話不扯,一般情況下,我們會碰到的記憶體問題有使用未初始化的指標,使用空指標,釋放已經釋放過的記憶體等等。最近工作中也遇到兩個記憶體相關的問題,覺得記下來還是有些價值的。誰分配,誰釋放
一個第三方提供的類的物件,每次析構的時候都會crash。仔細檢查後發現,我們在此之前new了一塊記憶體並將指標設給了該物件的一個成員(object.p)。於是懷疑該類在解構函式中試圖delete該塊記憶體。 試了一下在析構之前先將Object.p置0, 問題果然不再存在,於是基本可以確定是這個原因了。
這裡其實有兩個問題,一是我們的程式碼沒有釋放自己分配的記憶體;二是第三方庫的程式碼,不應該delete不是自己分配的記憶體。誰分配,誰釋放是一個相當重要的原則,一個試圖釋放使用者new出來的記憶體的第三方庫,至少存在以下問題:
- 一般情況下,使用著會釋放自己new出來的記憶體,那麼這裡就會出現二次釋放的問題。
- 如果任何一方過載了operator new和operator delete,定義了自己的記憶體池,那麼基本就是雞同鴨講了。
- 如果傳給你的是一個棧上的物件呢,你也delete?
無意中被破壞的記憶體
我們有一個基於記憶體的transaction manager,基本原理就是,每做一個資料修改就會將被修改過的記憶體備份起來,然後undo的時候,將備份的資料再覆蓋回來。當然,這裡需要被備份的記憶體,使用一種特殊的方式分配的,我們稱之為transacted memory。考慮如下流程:
- 做一個資料修改,比如畫一個圓
- 該操作需要將提供畫圓函式的DLL動態載入進來
- 在該DLL載入及初始話化過程中,建立了一個transacted memory,比如說一個std::map
- 畫圓完成後,做一個Undo操作
於是該新畫出來的圓又被原記憶體覆蓋回去了,而同時,在載入DLL過程中分配的那個std::map也被覆蓋回去了,注意,載入DLL的過程並不會被undo,於是,當程式再次試圖訪問該map時出錯,因為該map的內容已經完全面目全非了。
這個bug花了我4、5個小時才發現問題所在,解決方法其實也很簡單,那就是避免在初始化DLL時分配transacted memory。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-672527/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- android 關於記憶體優化的一些總結Android記憶體優化
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- 關於一些奇葩的相容bug
- 關於autoreleasepool記憶體管理記憶體
- 關於JavaScript的記憶體機制JavaScript記憶體
- [轉帖]關於記憶體管理:計算頁表大小記憶體
- 關於 PHP 記憶體溢位的思考PHP記憶體溢位
- 【譯】Ringbahn的兩個記憶體Bug記憶體
- 關於虛擬機器記憶體和JVM記憶體設定的思考虛擬機記憶體JVM
- 一些轉儲和清除記憶體物件和物理物件的命令(轉)記憶體物件
- 關於PHP記憶體洩漏的問題PHP記憶體
- 關於JVM堆外記憶體的一切JVM記憶體
- 關於java記憶體訪問重排序的思考Java記憶體排序
- 關於持久記憶體(PMem)你知道多少?記憶體
- [轉載] Java直接記憶體與堆記憶體Java記憶體
- [20191220]關於共享記憶體段相關問題.txt記憶體
- 關於圖片在記憶體中的大小(k或者M)記憶體
- [效能]【JVM】關於JVM記憶體的N個問題JVM記憶體
- 關於fsdb的一些記錄
- 解Bug之路-記一次JVM堆外記憶體洩露Bug的查詢JVM記憶體洩露
- 一個導致JVM實體記憶體消耗大的BugJVM記憶體
- 關於dataWithContentsOfFile 讀取大檔案的記憶體問題記憶體
- 基於記憶體的關聯式資料庫memsql初探記憶體資料庫SQL
- 關於 Angular SSR 應用在渲染中止時如何避免記憶體洩漏問題的一些嘗試Angular記憶體
- [20191223]關於共享記憶體段相關問題3.txt記憶體
- [20190320]關於使用smem檢視記憶體使用的問題.txt記憶體
- 關於JVM 記憶體的 N 個高頻面試問題!JVM記憶體面試
- golang的記憶體相關內容Golang記憶體
- 記憶體優化相關記憶體優化
- project中的堆疊記憶體,記憶體地址引用,gc相關問題Project記憶體GC
- Perfdog 玩轉記憶體洩漏記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- 請給Sprint Boot多一些記憶體boot記憶體
- 記Java中有關記憶體的簡單認識Java記憶體
- 關於C/CPP使用結構體中位域的一些筆記結構體筆記
- 關於流媒體的一些常識
- 關於aspnetcore中介軟體的一些思考NetCore
- 記憶體管理篇——實體記憶體的管理記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體