我以前也遇到过这个问题。后阅读分析了MFC的CString源码后,已经解惑。共大家分享: 在VC++6中,CString 的拷贝构造函数没有使用内存分配,而是使用的引用,它内部保存了一个引用的计数器(这是错误的根源,MFC还有很多BUG那,以后有时间给大家介绍)。比如: CString str1="aaa"; CString str2=str1; //注意,这时候str2并没有调用 new ,而是使用str1的引用同时,str1中保存的引用记数++ str2="abcd1234"; //好了,现在str2才分配内存,str1引用记数--。这同时也是为什么str2.Empty()就没有内存泄露的原因。因为str1的引用记数也--了。 另外,它分配内存的方法是4字节对齐的64字节的倍数+sizeof(内部结构)(超过64的时候)。 在多数情况下,比较简单的使用过程中,MFC的这个BUG不会发作,也就是不会有内存泄露。那什么时候CString会暴露出BUG那? 我以前出现错误的经验是:如果多次调用带有CString引用的参数的函数(形如:funstr(CString &str);这样的函数),在一定的时候(和字符串长度有关系),CString的内部引用记数器发生记数混乱,造成内存泄露。 VC++7(.NET) 中,MFC彻底修改了CString,把它写成了CStringT形式的模板类。它有没有BUG,目前我还不太清楚。 |
关于 MFC 中 CString 内存泄露的问题
最新推荐文章于 2020-09-25 16:26:50 发布