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條評論