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