Когда я компилирую в режиме выпуска, у меня происходит повреждение кучи при освобождении std :: string.
Фактически, в DLL с именем Atc.dll
я вызываю функцию, которая находится в другой DLL с именем Utilies.dll
.В конце моей функции в Atc.dll
у меня повреждена куча.
Это моя функция в Atc.dll
:
void CoreController::readConfigXMLFile()
{
ConfigFileManager configFileManager;
std::string pathXmlFilesTemp = configFileManager.getPathXMLFiles();
}
Затем эта функция объявлена getPathXMLFiles
в Utilies.dll
:
std::string ConfigFileManager::getPathXMLFiles()
{
bool err = false;
std::string ret = "";
if (!mParserXml.getNodeTextValue(sPathXmlFilesTag, ret))
{
err = true;
}
if (err)
{
ret = sPathXMLFilesDefault;
}
return ret;
}
Примечание. Если здесь я не вызову функцию getNodeTextValue
, повреждение кучи не происходит.Итак, есть функция getNodeTextValue
, которая находится в той же DLL, что и getPathXMLFiles
:
bool ParseXml::getNodeTextValue(const string& path, string& nodeValue)
{
DOMNode* child = XmlNode::getChildNodeByPath(xmlNode, path);
//If path is valid.
if(XmlNode::isValid(child))
{
char* str = XmlNode::getTextValue(child);
//If node contains text.
if(str != NULL)
{
nodeValue = str;
XmlNode::freeXMLString(str);
return true;
}
}
//Either path is not valid or node does not contain text
nodeValue = "";
return false;
}
И вот где происходит повреждение кучи (STL):
void _Tidy(bool _Built = false,
size_type _Newsize = 0)
{ // initialize buffer, deallocating any storage
if (!_Built)
;
else if (this->_BUF_SIZE <= this->_Myres)
{ // copy any leftovers to small buffer and deallocate
_Elem *_Ptr = this->_Bx._Ptr;
if (0 < _Newsize)
_Traits::copy(this->_Bx._Buf, _Ptr, _Newsize);
this->_Alval.deallocate(_Ptr, this->_Myres + 1); // <-- HEAP CORRUPTION
}
this->_Myres = this->_BUF_SIZE - 1;
_Eos(_Newsize);
}
Может кто-нибудь сказать мне, почему происходит эта кучная коррупция и как ее избежать?
Спасибо за вашу помощь.