Повреждение кучи между двумя DLL - PullRequest
2 голосов
/ 10 августа 2011

Когда я компилирую в режиме выпуска, у меня происходит повреждение кучи при освобождении 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);
  }

Может кто-нибудь сказать мне, почему происходит эта кучная коррупция и как ее избежать?

Спасибо за вашу помощь.

1 Ответ

8 голосов
/ 10 августа 2011

Обычная причина (в Windows) состоит в том, что вы выделяете память в 1 dll, передаете ее другому, когда освобождается.Часто это хорошо, но если каждая dll построена с разным CRT (библиотека времени выполнения C), то вы получите такие проблемы.Причина в том, что отладочный CRT выполняет выделение памяти немного по-другому, чем освобождающий CRT (в основном заполнение всех выделений защитными блоками для отображения переполнения буфера и т. Д.).

Так что убедитесь, что обе библиотеки (и ваше приложение) всепостроены с одинаковыми ЭЛТ.

...