问大家关于new,catch的问题
1)New和malloc的区别
2)如何检查程序内存泄露?如果不用工具,不用code review,如何检查?
3)C++异常抛出后,如果没有写对应的CATCH,会怎么样?
[解决办法]
1. 一个调构造函数,一个不调
2. 直接看程序用的内存,是不是持续增长
3. 崩溃
[解决办法]
问题1,2码事啊,入了C++就请忘了malloc吧
问题2,用专用工具。不过,C++下,智能指针和容器的大量使用,内存泄露应该是极难发生的事了,要与时俱进。
问题3,自己写个代码试一下就知道了。
[解决办法]
抛出异常,没有catch,不一定就崩溃吧,视程序而定!
[解决办法]
你给出一个没 catch 而又不崩溃的异常的例子来看看?
[解决办法]
麻烦大家把第2题再考虑一下,我觉得简单看程序内存是否增长不太好吧,有些要很长时间才暴露的。
我想了一个,就是数new和delete的个数,如果new多就肯定有泄漏了。
还有没有其他的方法呢?
-----
不可取
[解决办法]
catch(...) 是捕捉所有异常,加了之后就是已经捕捉的异常了,自然不会崩溃了。
你能数 new / delete 个数已经算是在检查代码了啊,算是 code review 了吧。再说 new 和 delete 在循环中你怎么数? 不如直接下 API 钩子 HeapAlloc/HeapFree
[解决办法]
1.找到这两个函数的地址
2.将从这个地址开始的前几个字节保存下来,或者手动看看这几个字节是些什么指令。
3.用 VirtualProtect 函数将这个地址上的内存权限提升为可写的。
4.修改函数的前几个字节,一般就是修改为一条 jmp 指令,直接跳转到自己的函数中去。
5.自己写一个函数,一班是 __declspec( naked ) 属性的,在这个函数里面完成统计工作,并重新执行一次第二步的代码之后 jmp 回去,或者是把保存的字节拷贝回去,重新执行原来的函数。
[解决办法]
一三不用说了
二最简便快捷的方式就是可以看输出窗口打印出内存泄露的地方或者是根据内存泄露的规律,人为泄露内存,采取逐步逼近的方法获取内存泄露的地方
[解决办法]
2. 可以试试CRT的一套检查内存泄露的方法。 #define _CRTDBG_MAP_ALLOC就可以,然后可以在vc的output windows里面看到是否有内存泄露。参见msdn的文章:CRT Debugging Techniques
[解决办法]
具体的参考见 http://msdn2.microsoft.com/en-us/library/x98tx3cf(VS.80).aspx