前段時間寫了一篇日誌叫《讓c++更像c#》,但我寫的那段示例**中的有關記憶體洩漏的問題當時我說先不管,其實是那時沒有找到很好的解決方法。原因是沒有辦法去判斷乙個指標到底是指向堆記憶體,還是指向棧記憶體(windows系統沒有api來實現這樣的功能)。當時google、baidu都搜遍了,沒有找到解決辦法。
今天在看國外的一篇技術文章的時候,發現有個印度阿三就在研究這個問題!他給出了一種解決辦法。首先把他介紹,作業系統會為每乙個系統中執行的執行緒分配乙個資料結構叫做tib(thread information block)或者叫teb(thread enviroment block)。裡面記錄了與某個執行緒相關的所有資訊。當然包括執行緒相關的堆疊位址資訊。而堆疊的棧頂與棧基址分別存放在fs暫存器的4與8位置處。所以他通過嵌入式彙編實現了判斷指標是棧指標,還是堆指標的方法。**如下:
bool ismemoryonstack( lpvoid pvoid )
if( pvoid <= dwstacktop && pvoid >= dwstacklowcurrent )
// pointer dosen't point to the stack
return false;
}現在只需要把ctest可能引起記憶體洩漏的函式修改為如下,就可以解決問題了:
ctest(ctest* & t)
}這裡使用指標引用的好處是在防止在釋放了指標的記憶體後,使用者繼續訪問指標的記憶體。
到此為止,問題全部解決了!多謝這個印度阿三了!印度的軟體行業確實是挺牛比的!
遞迴問題解決漢諾塔 C
includevoid hanoii char a,char b,char c,int n void main void hanoii char a,char b,char c,int n else 首先讓我們來看一看 c語言的實現方法 我們可以把所有情況都看做一種情況 即看作兩層漢諾塔。首先我們來...
C 版工作流之第4版遺留問題(13)
2015年10月,進入公司的第3個月,正式轉正了。在接下來的3個月裡,每天坐最後一趟地鐵回家,硬是在3個月中完成了乙個 超4w行的工作流引擎開發。有幾次早上上地鐵,眼前一片黑,就地坐幾分鐘後才回覆,到公司後繼續完善設計方案與 除錯.在2016年1月27日,帶著一位實施同事去了廣州珠江新城,在花園廣場...
c 中Session丟失問題解決辦法
我們在用c 開發程式的時候經常會遇到session很不穩定,老是資料丟失。下面就是session資料丟失的解決辦法 1 在web.config檔案中修改session狀態儲存模式,如 2 啟動系統服務 asp.net狀態服務 系統預設是手動啟動的 3 如果session中儲存的資料型別是自定義的,如...