分类: C/C++
2008-05-31 09:42:44
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; } |
IXMLDOMDocument *pDoc = NULL; CoCreateInstance(...) …… pDoc->Release(); |
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!\")); |
IXMLDOMDocumentPtr docPtr = NULL; docPtr.CreateInstance(...) …… |
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!\")); |
Interface** operator&() throw() { _Release(); m_pInterface = NULL; return &m_pInterface; } |
template<> _com_ptr_t(const _com_ptr_t& cp) throw() : m_pInterface(cp.m_pInterface) { _AddRef(); } |
classA *pA = new classA; auto_ptr auto_ptr |
1.2:auto_ptr是不能以传值方式进行传递的。
因为所有权的转移,会导致传入的智能指针失去对指针的所有权。如果要传递,可以采用引用方式,利用const引用方式还可以避免程序内其它方式的所有权的转移。就其所有权转移的做法:可以查看auto_ptr的拷贝构造和=操作符的源码,此处略。
1.3:其它注意事项:
·不支持数组。
·注意其Release语意,它没有引用计数,与com提供的智能指针不同。Release是指释放出指针,即交出指针的所有权。
·auto_ptr在拷贝构造和=操作符时的特珠含义决定它不能做为STL标准容器的成员,
好了,看了上面的注意事项,特别是第三条,基本上可以得出结论:在实际应用场合,auto_ptr基本没什么应用价值的。
[NextPage]
2:如何得到支持容器的智能指针。
我们利用auto_ptr的原型,制作一个引用计数的智能指针,则时让它支持STL容器的标准。实现代码很简单,参照了《C++标准程序库》中的代码,关键代码如下:
template class CountedPtr { T * ptr; long * counter; public: //构造 explicit CountedPtr(T* p = NULL) :ptr(p),count(new long(1){} //析构 ~CountedPtr() {Release();} //拷贝构造 CountedPtr(cont CountedPtr :ptr(p.ptr),count(p.count) {++*counter;} //=操作符 CountedPtr if(this!=&p) { Release(); ptr=p.ptr; counter=p.counter;++*counter; } return *this; } //其它略 .... private: void Release() { if(--*counter == 0) { delete counter; delete ptr; } } } |