C++智能指针应用分析,第1张

C++智能指针应用分析,第2张

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();
}

嗯,不会有问题的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++智能指针应用分析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情