C++智能指针应用分析
1.关于纠错,智能指针在MFC和ATL中的应用
1.如何在Windows中方便地查看当前进程使用的内存?
代码虽然简单,但是对于纠错很有用处。您不必经常切换任务管理器来检查内存使用情况。代码如下:
UINT C _ base util::getProcessMemoryUsed()
{
UINT ui total = 0L;
HANDLE h process =::GetCurrentProcess();
PROCESS _ MEMORY _ COUNTERS PMC;
if(::GetProcessMemoryInfo(h process,&pmc,sizeof(pmc)))
uiTotal = pmc。WorkingSetSize
return ui total;
}
注意:因为内存使用会是一个不稳定的过程,需要在程序稳定的时候调用才能准确。
2.在使用COM的调度指针时,如果不使用Com智能指针,很容易出错。
2.1:忘记在所有出口释放指针。
例如:
IXMLDOMDocument * pDoc = NULL
CoCreateInstance(...)
……
pDoc-> Release();
错误:如果中间代码异常,pDoc不正常释放,导致内存泄漏。
2.2:同一个指针变量被重复使用,导致中间生成的调度指针没有被释放。
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。创建实例(...)
……
这不会是问题,因为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重载了&运算符。取指针的时候有以下操作,哎。
接口**运算符&()throw()
{
_ Release();
m _ Pinter face = NULL;
return & m _ Pinter face;
}
3.3: nodePtr = nodePrt2,不会有问题:
仔细检查源代码。Attach会在=运算符中被调用,Attach的做法是:_Release()会先被调用;
3.4:再看值传递:复制构造函数如下
template _ com _ ptr _ t(const _ com _ ptr _ t & CP)throw()
:m _ Pinter face(CP . m _ Pinter face)
{
_ AddRef();
}
嗯,不会有问题的。
位律师回复
0条评论