前段时间,在查控件的内存泄露时,最终找出一个错误:在使用XMLDom(COM)时,由于重复使用某接口指针前未释放Dispatch指针(Release),而导致内存泄露,而此类错误(如同BSTR类型的泄漏),VC的调试器和Bondcheck均无能为力。解决办法,似乎只有细心一途。
但只要稍稍仔细看看,就可发现,实际上如果正确使用VC提供的智能指针,是可以避免此问题的。
另外,一直为Java程序员津津乐道的内存使用无需管理的优势,一直知道用C++的智能指针可以模拟。但一直没实际动手做过,趁此分析之机,用C++简单包装了一个。反正粗看之下,可以达到与Java类似的效果,当然,C++的对象更高效且节省内存。
就以上所提到的,时间关系,我只能简单罗列几点,代码应该是正确的(但未检查)。前后文没什么逻辑关系,但如果要进一步应用C++的智能指针,相信会起到抛砖引玉之效。
一:关于纠错,MFC和ATL中智能指针的应用
1:在Windows中如何方便的查看当前进程使用的内存。
虽然代码简单,但对纠错时有大用处,不用不停的通过切换任务管理器来查看内存使用。代码如下:
UINT C_BaseUtil::getProcessMemoryUsed() { UINT uiTotal = 0L; HANDLE hProcess = ::GetCurrentProcess(); PROCESS_MEMORY_COUNTERS pmc; if(::GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc))) uiTotal = pmc.WorkingSetSize; return uiTotal; } |
注意:由于内存使用会是一个不稳定的过程,所以,需要在程序稳定时进行调用,才能准确。
2:在使用Com的Dispatch指针时,如果不使用COM智能指针,容易出现的错误。
2.1:忘记在所有出口释放指针。 如:
IXMLDOMDocument *pDoc = NULL; CoCreateInstance(...) …… pDoc->Release(); |
错误:如果中间代码发生异常,则pDoc未能正常释放,造成内存泄露。
2.2:重复使用同一指针变量,导致中间生成的Dispatch指针未能释放。
IXMLDOMNode *pNode = NULL; if(FAILED(pDoc->selectSingleNode(_bstr_t("Workbook"), &pNode)) || pNode==NULL) throw(_T("selectSingleNode failed!")); if(FAILED(pDoc->selectSingleNode(_bstr_t("Workbook"), &pNode)) || pNode==NULL) throw(_T("selectSingleNode failed!")); |
错误:pNode未释放就开始第二次调用,造成内存泄露。或者类似pNode = pNode2的这种写法,也随手就出问题了。必须调用if(pNode) {pNode->Release();pNode=NULL;}
3:使用MFC提供的Com智能指针解决上述问题。
注意:可通过查看源码,看到#import生成的智能指针的原型是_com_ptr_t。
3.1:
IXMLDOMDocumentPtr docPtr = NULL; docPtr.CreateInstance(...) …… |
这下不会有问题了,因为docPtr在析构时会有正确的释放处理。
3.2:
IXMLDOMNodePtr nodePtr = NULL; if(FAILED(pDoc->selectSingleNode(_bstr_t("Workbook"), &nodePtr)) || nodePtr==NULL) throw(_T("selectSingleNode failed!")); if(FAILED(pDoc->selectSingleNode(_bstr_t("Workbook"), &nodePtr)) || nodePtr==NULL) throw(_T("selectSingleNode failed!")); |
不会出错了,因为_com_ptr_t重载了&操作符,在取指针时,有如下操作,嘿。
Interface** operator&() throw() { _Release(); m_pInterface = NULL; return &m_pInterface; } |
3.3: nodePtr = nodePrt2 ,也不会有问题:
仔细查看源码,在=操作符中会调用Attach,而Attach的做法是:会先调用_Release();
<  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |