Memory leak
-
Hi i tried to reduce my memory leak.I reduced that,but still only few bytes of memory leak.I checked everything,but still i cant find.Pl anybody can help.Thanks in advance. HRESULT hr; IXMLDOMDocument2 *pIXMLDOMDocument2=NULL; IXMLDOMNodeList *pIXMLDOMNodeList=NULL; IXMLDOMNode *pIXMLDOMNode=NULL,*pIXMLDOMNode1=NULL; IXMLDOMNamedNodeMap *pIXMLDOMNamedNodeMap1 = NULL; VARIANT_BOOL boolvalue; long Tablelen; CComVariant Tablename; hr = CoInitialize(NULL); hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&pIXMLDOMDocument2); CComVariant varValue="testing.xml"; if (FAILED(hr)) return(hr); if(SUCCEEDED(hr)) { hr=pIXMLDOMDocument2->load(varValue,&boolvalue); pIXMLDOMDocument2->selectNodes((_bstr_t)"DATABASE/TABLE[@Left]",&pIXMLDOMNodeList); pIXMLDOMNodeList->get_length(&Tablelen); HWND hListBox=GetDlgItem(hDlg,IDC_LIST); pIXMLDOMNodeList->reset(); for(int i=0;i< Tablelen;i++) { pIXMLDOMNodeList->get_item(i,&pIXMLDOMNode); pIXMLDOMNode->get_attributes(&pIXMLDOMNamedNodeMap1); pIXMLDOMNode->Release(); pIXMLDOMNode=NULL; pIXMLDOMNamedNodeMap1->getNamedItem((_bstr_t)"Name",&pIXMLDOMNode1); pIXMLDOMNode1->get_nodeValue(&Tablename); SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)(char *)(_bstr_t)Tablename); pIXMLDOMNode1->Release(); pIXMLDOMNode1=NULL; pIXMLDOMNamedNodeMap1->Release(); pIXMLDOMNamedNodeMap1=NULL; } CHECK_AND_RELEASE(pIXMLDOMDocument2); CHECK_AND_RELEASE(pIXMLDOMNode1); CHECK_AND_RELEASE(pIXMLDOMNodeList); CHECK_AND_RELEASE(pIXMLDOMNode); CHECK_AND_RELEASE(pIXMLDOMNamedNodeMap1); } CoUninitialize();
-
Hi i tried to reduce my memory leak.I reduced that,but still only few bytes of memory leak.I checked everything,but still i cant find.Pl anybody can help.Thanks in advance. HRESULT hr; IXMLDOMDocument2 *pIXMLDOMDocument2=NULL; IXMLDOMNodeList *pIXMLDOMNodeList=NULL; IXMLDOMNode *pIXMLDOMNode=NULL,*pIXMLDOMNode1=NULL; IXMLDOMNamedNodeMap *pIXMLDOMNamedNodeMap1 = NULL; VARIANT_BOOL boolvalue; long Tablelen; CComVariant Tablename; hr = CoInitialize(NULL); hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&pIXMLDOMDocument2); CComVariant varValue="testing.xml"; if (FAILED(hr)) return(hr); if(SUCCEEDED(hr)) { hr=pIXMLDOMDocument2->load(varValue,&boolvalue); pIXMLDOMDocument2->selectNodes((_bstr_t)"DATABASE/TABLE[@Left]",&pIXMLDOMNodeList); pIXMLDOMNodeList->get_length(&Tablelen); HWND hListBox=GetDlgItem(hDlg,IDC_LIST); pIXMLDOMNodeList->reset(); for(int i=0;i< Tablelen;i++) { pIXMLDOMNodeList->get_item(i,&pIXMLDOMNode); pIXMLDOMNode->get_attributes(&pIXMLDOMNamedNodeMap1); pIXMLDOMNode->Release(); pIXMLDOMNode=NULL; pIXMLDOMNamedNodeMap1->getNamedItem((_bstr_t)"Name",&pIXMLDOMNode1); pIXMLDOMNode1->get_nodeValue(&Tablename); SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)(char *)(_bstr_t)Tablename); pIXMLDOMNode1->Release(); pIXMLDOMNode1=NULL; pIXMLDOMNamedNodeMap1->Release(); pIXMLDOMNamedNodeMap1=NULL; } CHECK_AND_RELEASE(pIXMLDOMDocument2); CHECK_AND_RELEASE(pIXMLDOMNode1); CHECK_AND_RELEASE(pIXMLDOMNodeList); CHECK_AND_RELEASE(pIXMLDOMNode); CHECK_AND_RELEASE(pIXMLDOMNamedNodeMap1); } CoUninitialize();
Jesus!!! Does this code work???
(_bstr_t)"DATABASE/TABLE[@Left]"
What is this? Never, never do like this. Do:_bstr_t(OLESTR("DATABASE/TABLE[@Left]"))
pIXMLDOMNode->Release(); pIXMLDOMNode=NULL;
It's not bad, but pIXMLDOMNode = 0 is enough.(LPARAM)(char *)(_bstr_t)Tablename
Should be:reinterpret_cast<LPARAM>(static_cast<TCHAR*>(_bstr_t(Tablename)))
Such a bad cast should be explicit.pIXMLDOMNode->get_attributes(&pIXMLDOMNamedNodeMap1);
You are working with very smart pointer. Instead, do like this:pIXMLDOMNamedNodeMap1 = pIXMLDOMNode->attributes;
What is:CHECK_AND_RELEASE(pIXMLDOMDocument2);
May be it a:#define CHECK_AND_RELEASE(x) x->AddRef()
I don't know. Summary. 1. Never, never use c-casts (like (_bstr_t)x, (LPARAM)y, etc). They are the worst evil, unless you damn sure that you do. It's very hard to find a bug in a such code. 2. Read about _com_ptr_t. Learn how it's intended to use. 3. Avoid macros. 4. Optional, but strongly recommended. Get a Stroustrup.