這篇文章主要介紹“C#內(nèi)存泄露問題分析”,在日常操作中,相信很多人在C#內(nèi)存泄露問題分析問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C#內(nèi)存泄露問題分析”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比潮安網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式潮安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋潮安地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
今天在看國(guó)外的一篇技術(shù)文章的時(shí)候,發(fā)現(xiàn)有人就在研究這個(gè)問題!他給出了一種解決辦法。首先把他介紹,操作系統(tǒng)會(huì)為每一個(gè)系統(tǒng)中運(yùn)行的線程分配一個(gè)數(shù)據(jù)結(jié)構(gòu)叫做TIB(Thread Information Block)或者叫TEB(Thread Enviroment BLock)。里面記錄了與某個(gè)線程相關(guān)的所有信息。當(dāng)然包括線程相關(guān)的堆棧地址信息。而堆棧的棧頂與?;贩謩e存放在FS寄存器的4與8位置處。所以他通過嵌入式匯編實(shí)現(xiàn)了判斷指針是棧指針,還是堆指針的方法。代碼如下:
bool IsMemoryOnStack( LPVOID pVoid ) { LPVOID dwStackTop = 0; LPVOID dwStackLowCurrent = 0; __asm { mov EAX, FS:[4] mov dwStackTop, eax mov EAX, FS:[8] mov dwStackLowCurrent, eax } if( pVoid < = dwStackTop && pVoid >= dwStackLowCurrent ) { // The memory lie between the stack top and stack commited. return true; } // Pointer dosen't point to the stack return false; }
現(xiàn)在只需要把CTest可能引起內(nèi)存泄漏的函數(shù)修改為如下,就可以解決問題了:
CTest(CTest* & t) { this->x=t->getX(); if(!IsMemoryOnStack(t)) { delete t; t=0; } }
這里使用指針引用的好處是在防止在釋放了指針的內(nèi)存后,用戶繼續(xù)訪問指針的內(nèi)存。
到此,關(guān)于“C#內(nèi)存泄露問題分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!