再谈让C++更像C#:C#内存泄露问题
前段时间写了一篇日志叫《让C++更像C#》,但我写的那段示例代码中的有关内存泄漏的问题当时我说先不管,其实是那时没有找到很好的解决方法。不好解决C#内存泄露的原因是,没有办法去判断一个指针到底是指向堆内存,还是指向栈内存(windows系统没有API来实现这样的功能)。当时google、baidu都搜遍了,没有找到解决办法。
现在,就进一步研究这个C#内存泄露的问题。
今天在看国外的一篇技术文章的时候,发现有人就在研究这个问题!他给出了一种解决办法。首先把他介绍,操作系统会为每一个系统中运行的线程分配一个数据结构叫做TIB(Thread Information Block)或者叫TEB(Thread Enviroment BLock)。里面记录了与某个线程相关的所有信息。当然包括线程相关的堆栈地址信息。而堆栈的栈顶与栈基址分别存放在FS寄存器的4与8位置处。所以他通过嵌入式汇编实现了判断指针是栈指针,还是堆指针的方法。代码如下:
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; }
现在只需要把CTest可能引起内存泄漏的函数修改为如下,就可以解决问题了:
CTest(CTest* & t) { this->x=t->getX(); if(!IsMemoryOnStack(t)) { delete t; t=0; } }
这里使用指针引用的好处是在防止在释放了指针的内存后,用户继续访问指针的内存。
到此为止,问题全部解决了!印度的软件行业确实是挺牛比的!
相关推荐
hanjinixng00 2020-11-12
bearhoopIT之道 2020-11-11
拉斯厄尔高福 2020-10-19
dabian 2020-09-07
Web前端成长之路 2020-07-07
csdnyasin 2020-06-28
徐建岗网络管理 2020-06-26
penkgao 2020-06-25
fengjing81 2020-06-24
penkgao 2020-06-13
qscool 2020-06-12
chaocc0xs 2020-06-12
风吹夏天 2020-06-08
fengjing81 2020-06-06
jvm 2020-06-06
AaronPlay 2020-06-02