本地在使用LingosHook時,意外發現內存占用越來越高,很是奇怪,因為自以為多年編程養成的習慣對內存的使用還是很敏感的,不應該犯“內存泄露”,這樣“常見且低級”的錯誤的。
一開始懷疑是抓取IE窗口內容部分代碼有問題,因為自己對COM不很熟悉,其中涉及很多少用的類型和方法,加上DLL和APP間交換數據也是用了new操作的。然而去除這部分功能,內存依然在泄露,越發覺得沒有道理了,因為其它代碼除了wxWidgets都是自己敲的了,wxWidgets是不會出問題的(做任何判斷的時候,需要先定義一個稱為不變量或者基礎點樣的標桿,不然沒有對比或者基礎,是難以確認問題所在的),然而事實經過隔離分析,發現問題就是出現在自己的代碼中--TinyHtmlParser對象。這就奇怪了,代碼不長,看來看去,沒發現有這樣的錯誤啊,new了,也free了,怎么還有泄露呢?最后開始懷疑自己了,于是在new的地方和free的地方分別加上計數器,可是計數器值相等,就是說new了多少對象,也free了多少對象。。。瘋了。。。
當然最終還是發現問題所在了,唉,將C++和C同時放在腦袋里(寫TinyHtmlParser時是上班寫C,下班寫C++)實在是太害人了--new出來的對象怎么能用free釋放呢?!該用delete啊。。。唉,C++/C混用害死人啊。。。
<-------LingosHook說明分隔線-------->
由于LingosHook安裝包的制作工程只能下班編譯,因此這個內存泄露問題要等晚上重新打包更改了,計劃也修改一下分析結果的過程的代碼,以其更方便的支持多詞典分析,同時也減少了HTML字串的次數。以前理論上是有N個詞典結果,需要N+1此分析,改了之后只需要一次了,和詞典數量無關了。