Commit 3fb1ab66 authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

memory leak

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@59187 954022d7-b5bf-4e40-9824-e11837661b57
parent e5773581
...@@ -176,9 +176,8 @@ namespace XmlUtils ...@@ -176,9 +176,8 @@ namespace XmlUtils
// CXmlNode // CXmlNode
CXmlNode::CXmlNode(const CXmlNode& oSrc) CXmlNode::CXmlNode(const CXmlNode& oSrc)
{ {
m_pBase = oSrc.m_pBase; m_pBase = NULL;
if (NULL != m_pBase) SetBase(oSrc.m_pBase);
m_pBase->AddRef();
} }
CString CXmlNode::private_GetXml() CString CXmlNode::private_GetXml()
...@@ -223,9 +222,10 @@ namespace XmlUtils ...@@ -223,9 +222,10 @@ namespace XmlUtils
delete m_pDocument; delete m_pDocument;
return false; return false;
} }
// m_pBase AddRef, CXmlNode m_pBase( RefCount==1, AddRef )
m_pBase = m_pDocument->m_pNode; m_pBase = m_pDocument->m_pNode;
m_pBase->AddRef(); // Parse Node m_pDocument AddRef, Release( ), Node
m_pDocument->Release();
return true; return true;
} }
...@@ -251,10 +251,10 @@ namespace XmlUtils ...@@ -251,10 +251,10 @@ namespace XmlUtils
delete m_pDocument; delete m_pDocument;
return false; return false;
} }
// m_pBase AddRef, CXmlNode m_pBase( RefCount==1, AddRef )
m_pBase = m_pDocument->m_pNode; m_pBase = m_pDocument->m_pNode;
m_pBase->AddRef(); // Parse Node m_pDocument AddRef, Release( ), Node
m_pDocument->Release();
return true; return true;
} }
bool CXmlNode::FromXmlString(const std::wstring& sString) bool CXmlNode::FromXmlString(const std::wstring& sString)
...@@ -300,10 +300,17 @@ namespace XmlUtils ...@@ -300,10 +300,17 @@ namespace XmlUtils
} }
void CXmlNode::Clear() void CXmlNode::Clear()
{ {
if (NULL != m_pBase) this->SetBase(NULL);
m_pBase->Release(); }
void CXmlNode::SetBase(CXmlNodeBase* pBase)
{
CXmlNodeBase* pBaseOld = m_pBase;
m_pBase = pBase;
if(NULL != m_pBase)
m_pBase->AddRef();
if (NULL != pBaseOld)
pBaseOld->Release();
} }
CString CXmlNode::ReadAttributeBase(const wchar_t* bstrName) CString CXmlNode::ReadAttributeBase(const wchar_t* bstrName)
{ {
return GetAttribute(CString(bstrName)); return GetAttribute(CString(bstrName));
...@@ -520,8 +527,7 @@ namespace XmlUtils ...@@ -520,8 +527,7 @@ namespace XmlUtils
if (strNodeName == GetNameNoNS(m_pBase->m_nodes[i]->m_sName)) if (strNodeName == GetNameNoNS(m_pBase->m_nodes[i]->m_sName))
{ {
CXmlNodeBase* pBase = m_pBase->m_nodes[i]; CXmlNodeBase* pBase = m_pBase->m_nodes[i];
pBase->AddRef(); node.SetBase(pBase);
node.m_pBase = pBase;
break; break;
} }
} }
...@@ -546,8 +552,7 @@ namespace XmlUtils ...@@ -546,8 +552,7 @@ namespace XmlUtils
if (sName == m_pBase->m_nodes[i]->m_sName) if (sName == m_pBase->m_nodes[i]->m_sName)
{ {
CXmlNodeBase* pBase = m_pBase->m_nodes[i]; CXmlNodeBase* pBase = m_pBase->m_nodes[i];
pBase->AddRef(); oNode.SetBase(pBase);
oNode.m_pBase = pBase;
bRes = true; bRes = true;
break; break;
} }
...@@ -569,9 +574,8 @@ namespace XmlUtils ...@@ -569,9 +574,8 @@ namespace XmlUtils
if (bGetAll || sName == m_pBase->m_nodes[i]->m_sName) if (bGetAll || sName == m_pBase->m_nodes[i]->m_sName)
{ {
CXmlNode oNode; CXmlNode oNode;
oNode.m_pBase = m_pBase->m_nodes[i]; CXmlNodeBase* pBase = m_pBase->m_nodes[i];
if (oNode.m_pBase) oNode.SetBase(pBase);
oNode.m_pBase->AddRef();
oNodes.m_nodes.insert(oNodes.m_nodes.end(), oNode); oNodes.m_nodes.insert(oNodes.m_nodes.end(), oNode);
} }
} }
...@@ -591,9 +595,8 @@ namespace XmlUtils ...@@ -591,9 +595,8 @@ namespace XmlUtils
for (int i = 0; i < nCount; ++i) for (int i = 0; i < nCount; ++i)
{ {
CXmlNode oNode; CXmlNode oNode;
oNode.m_pBase = m_pBase->m_nodes[i]; CXmlNodeBase* pBase = m_pBase->m_nodes[i];
if (oNode.m_pBase) oNode.SetBase(pBase);
oNode.m_pBase->AddRef();
oXmlNodes.m_nodes.insert(oXmlNodes.m_nodes.end(), oNode); oXmlNodes.m_nodes.insert(oXmlNodes.m_nodes.end(), oNode);
} }
} }
...@@ -608,10 +611,7 @@ namespace XmlUtils ...@@ -608,10 +611,7 @@ namespace XmlUtils
CXmlNode& CXmlNode::operator=(const CXmlNode& oSrc) CXmlNode& CXmlNode::operator=(const CXmlNode& oSrc)
{ {
m_pBase = oSrc.m_pBase; this->SetBase(oSrc.m_pBase);
if (NULL != m_pBase)
m_pBase->AddRef();
return *this; return *this;
} }
CString CXmlNode::GetNamespace(const CString& strNodeName) CString CXmlNode::GetNamespace(const CString& strNodeName)
......
...@@ -717,7 +717,7 @@ namespace XmlUtils ...@@ -717,7 +717,7 @@ namespace XmlUtils
{ {
CXmlNodeBase* pNode = m_nodes[i]; CXmlNodeBase* pNode = m_nodes[i];
if (NULL != pNode) if (NULL != pNode)
delete pNode; pNode->Release();
} }
} }
...@@ -888,6 +888,7 @@ namespace XmlUtils ...@@ -888,6 +888,7 @@ namespace XmlUtils
CXmlNode& operator=(const CXmlNode& oSrc); CXmlNode& operator=(const CXmlNode& oSrc);
private: private:
void SetBase(CXmlNodeBase* pBase);
CString GetNamespace(const CString& strNodeName); CString GetNamespace(const CString& strNodeName);
CString GetNameNoNS(const CString& strNodeName); CString GetNameNoNS(const CString& strNodeName);
public: public:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment