扔分,CString的Bug,做过的请进
MFC的CString有不少Bug,例如内存泄漏,空值判断失误等,我们最近还发现了一个新的问题,CString的内存管理在release模式采用堆的方式进行管理,不过对已经生成的堆在程序运行期间却没有释放机制。举个例子,程序在运行期间,如果需要解析文档,则需要生成的大量的CString对象,解析完毕后,程序释放了这些CString对象,但是MFC并没有释放CString所占用的内存,如果程序长期运行,则会造成大量的无效空间占用。解决办法不明,考虑了一下,可能有如下几种方案:
1。在MFC的基础上创建CString内存释放函数,察看了MFC的实现代码,由于CString的内存管理类CFixedAlloc将物理内存管理的成员指针m_pBlocks、m_pNodeFree设成了protected。在外面的代码难以访问,有没有什么办法可以绕过C++的成员保护机制?
2。利用std::string,或者其他代码替代CString,不过MFC中大量采用CString作为库函数的接口,而且将无法使用CStringArray(不过stl有替代方案),对已有程序修改工作量不少。同时,不知道std::string等替代方案在内存碎块问题上考虑如何?因此此方案稍候考虑。
3。改写mfc中CString内存管理的实现,增加运行中无用内存释放机制,这个释放代码还好说,可是怎么让改动生效呢?重新编译mfc?怎么做?会导致什么结果?
做过的朋友请介绍一下经验,没做过的朋友请多讨论,大家研究研究。。。