堆叠两个DLL之间的损坏

Ced*_*sme 2 c++ dll visual-studio-2010 visual-studio heap-corruption

当我在发布模式下编译时,我在std :: string的重新分配上有堆损坏.

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

我的功能在于Atc.dll:

void CoreController::readConfigXMLFile()
{
    ConfigFileManager configFileManager;
    std::string pathXmlFilesTemp = configFileManager.getPathXMLFiles();
}
Run Code Online (Sandbox Code Playgroud)

然后,这是在以下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;
}
Run Code Online (Sandbox Code Playgroud)

注意:如果在这里我没有调用该函数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;
}
Run Code Online (Sandbox Code Playgroud)

这就是堆损坏发生的地方(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);
  }
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么会发生这种堆腐败以及如何避免它?

谢谢你的帮助.

gbj*_*anb 8

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

因此,请确保所有dll(和您的应用程序)都使用相同的CRT构建.