两个dll之间的堆损坏

Heap corruption between two DLLs

本文关键字:损坏 之间 dll 两个      更新时间:2023-10-16

当我在释放模式下编译时,在std::string的解分配上有堆损坏。

实际上,在名为Atc.dll的DLL中,我调用了另一个名为Utilies.dll的DLL中的函数。在Atc.dll的函数结束时,我有堆损坏。

这是我在Atc.dll中的函数:

void CoreController::readConfigXMLFile()
{
    ConfigFileManager configFileManager;
    std::string pathXmlFilesTemp = configFileManager.getPathXMLFiles();
}

然后,这是Utilies.dll中声明的函数getPathXMLFiles:

std::string ConfigFileManager::getPathXMLFiles()
{
    bool err = false;
    std::string ret = "";
    if (!mParserXml.getNodeTextValue(sPathXmlFilesTag, ret))
    {
        err = true;
    }
    if (err)
    {
        ret = sPathXMLFilesDefault;
    }
    return ret;
}

注意:如果这里我不调用函数getNodeTextValue,堆损坏不会发生。因此,函数getNodeTextValuegetPathXMLFiles在同一个DLL中:

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);
  }

谁能告诉我为什么这个堆腐败发生和如何避免它?

谢谢你的帮助。

通常的原因(在Windows上)是你在一个dll中分配内存,当它释放时将其传递给另一个。通常这是好的,但如果每个dll都是用不同的CRT (C运行时库)构建的,那么你就会遇到这样的问题。原因是调试CRT的内存分配与发布CRT略有不同(主要是用保护块填充所有分配,以显示缓冲区溢出等)。

所以要确保两个dll(和你的应用程序)都是用相同的CRT构建的