說說DLL中記憶體問題

2021-05-22 15:58:23 字數 665 閱讀 1443

今天除錯動態庫的時候,有個函式在返回的時候總是要報錯。在callstack視窗中看見是堆疊釋放出了問題。但是我一向也是堅持誰申請誰釋放不是就ok了嗎。空氣這函式裡面還沒有堆操作,全部是區域性變數啊,怎麼會出錯呢?

經過仔細排查,最後把函式的呼叫方式全部改為_stdcall方式,當時還以為是不是引數出入棧問題,找不到原因就亂碰吧。但是雖然不是這裡的問題,我卻發現,當函式呼叫方式改為_stdcall方式後,除錯時call stack中的提示卻變得清晰,不像以前那樣全是難讀的彙編**,而是可以看清楚的函式呼叫關係。通過call stack往回追蹤,找到了是引數中使用了cstring型別作為引數,就是他引起的問題了。

原因個人分析如下:

初看上去,cstring是函式的引數,應該是乙個區域性變數吧,不會有問題吧。可是要清楚的是在對cstring賦值的時候,它不是複製了乙份,而是對原字串增加了乙個引用,到該變數生命週期結束時再解除引用。但問題是我傳遞給該引數的字串是從主應用程式中,也就是說是另乙個模組中。在該過程中也就間接地形成了我(主程式)申請,你(動態庫)釋放了。所以導致錯誤產生。

由於cstring使用方面,很多時候都想方設法的去使用他們來完成字串操作。用多了,就把他們當成int、char等基本型別使用了,都忘記了他們是經過加工的類了。於是問題就是常常處在這些使用最熟悉的東西身上。在此筆記一下,以吸取教訓,以希望能讓看到此文者不在犯這樣的錯。

說說記憶體對齊吧

說說記憶體對齊 為什麼要記憶體對齊?因為cpu為了提高指令提取效率,對資料的存放位址有要求。如果不對齊,會導致效率低下,甚至錯誤。如何對齊?既然cpu已經作了規範,剩下的事情就交給編譯器了。對於程式設計師,可以告訴編譯器按照怎麼的方式去 對齊。不同的編譯器指令不一樣 1 windows的編譯器cl ...

DLL記憶體載入

動態載入dll 功能 把乙個處於記憶體裡的dll直接載入並且使用。用途 免殺 靜態檔案查殺 外掛程式 防止遊戲自己hook了loadlibrary等函式 以及其他。原理 假設目前處於記憶體裡的dll是a,然後開闢乙個新的記憶體空間b,根據a的檔案頭等相關資訊,把b看做是載入記憶體。然後把資料拷貝到b...

記憶體載入Dll

分享乙份自己之前總結以前的 寫的dll記憶體載入庫c 版本 專案要自行編譯生成lib檔案 支援 1.win32標準dll 2.mfc dll 3.易語言dll 4.其他環境下生成的dll 但不能加殼加密 file include ldr.h ldr header ifndef ldr h defin...