C 智能指针应用分析

文章作者 100test 发表时间 2008:03:29 14:21:08
来源 100Test.Com百考试题网


一:关于纠错,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->0selectSingleNode(_bstr_t("Workbook"), &.pNode)) || pNode==NULL)
throw(_T("0selectSingleNode failed!")).
if(FAILED(pDoc->0selectSingleNode(_bstr_t("Workbook"), &.pNode)) || pNode==NULL)
throw(_T("0selectSingleNode 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->0selectSingleNode(_bstr_t("Workbook"), &.nodePtr)) || nodePtr==NULL)
throw(_T("0selectSingleNode failed!")).
if(FAILED(pDoc->0selectSingleNode(_bstr_t("Workbook"), &.nodePtr)) || nodePtr==NULL)
throw(_T("0selectSingleNode failed!")).

  不会出错了,因为_com_ptr_t重载了&.操作符,在取指针时,有如下操作,嘿。

Interface** operator&.() throw()
{
 _Release().
 m_pInterface = NULL.
 return &.m_pInterface.
}

  3.3: nodePtr = nodePrt2 ,也不会有问题:

  仔细查看源码,在=操作符中会调用Attach,而Attach的做法是:会先调用_Release().

  3.4:再看看值传递:拷贝构造函数如下

template<> _com_ptr_t(const _com_ptr_t&. cp) throw()
: m_pInterface(cp.m_pInterface)
{
 _AddRef().
}

  嗯,也不会有问题。

相关文章


c_c 中指针学习的两个绝好例子
C 中调用DLL实现数据加密
VC 与MATLAB混合编程
VC 中的伪随机数
C 智能指针应用分析
完成自编辑地DatePicker控件
专用寄存器的作用
通用寄存器的作用
汇编语言基础之CPU资源和存储器
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛