析構(gòu)過程中內(nèi)存相關(guān)錯(cuò)誤的絕大多數(shù)原因
今天記錄一下長久以來屢次犯的錯(cuò),每次都是換一種方法編碼來繞過這個(gè)問題實(shí)現(xiàn)功能的,因?yàn)檫@個(gè)問題太過隱蔽,導(dǎo)致今天才發(fā)現(xiàn)其中真正的原因...下面進(jìn)行問題描述:
2

3

第一行是在應(yīng)用程序中的堆棧中分配的內(nèi)存空間。
第二行是我自己寫的dll庫,用來讀取一些數(shù)據(jù)加入到keyValue中。
第三行是清空keyValue,其實(shí)如果不寫這一行的話,keyValue也會在函數(shù)結(jié)尾時(shí)清空,到那時(shí)同樣會出現(xiàn)錯(cuò)誤。
這一切乍一看沒啥問題,keyValue是局部變量,為什么局部變量的釋放會出現(xiàn)異常錯(cuò)誤呢?這是因?yàn)榈诙蠷eadData的緣故。ReadData的邏輯在另外一個(gè)可執(zhí)行模塊中,在其中分配的內(nèi)存空間不一定與當(dāng)前模塊在同一個(gè)堆區(qū)。
我們知道,std::map是一個(gè)樹結(jié)構(gòu)的容器,我在ReadData內(nèi)部往keyValue中添加了數(shù)據(jù),keyValue中會在堆區(qū)中分配樹節(jié)點(diǎn),而這個(gè)節(jié)點(diǎn)將會在當(dāng)前模塊在keyValue的析構(gòu)中被釋放。也就是說,我無意中在dll模塊中分配了堆空間,又無意中在exe模塊中企圖釋放該空間,這樣的行為導(dǎo)致錯(cuò)誤是不足為怪的。
時(shí)刻牢記,在一個(gè)模塊中分配和釋放同一塊內(nèi)存區(qū)域,警惕你所看不見的內(nèi)存分配和釋放。
posted on 2010-07-01 15:47 釀妹汁 閱讀(3342) 評論(11) 編輯 收藏 引用 所屬分類: C++ 、備忘