C++智能指針應用分析

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

嗯,不會有問題的。

位律師廻複

生活常識_百科知識_各類知識大全»C++智能指針應用分析

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情