2011-08-10 34 views
2

リリースモードでコンパイルすると、std :: stringの割り当て解除時にヒープが破損します。2つのDLL間のヒープ破損

実際、Atc.dllという名前のDLLでは、Utilies.dllという別のDLLにある関数を呼び出します。 Atc.dllの私の機能の最後に、ヒープの破損があります。 Atc.dll

この私の機能:

std::string ConfigFileManager::getPathXMLFiles() 
{ 
    bool err = false; 
    std::string ret = ""; 

    if (!mParserXml.getNodeTextValue(sPathXmlFilesTag, ret)) 
    { 
     err = true; 
    } 

    if (err) 
    { 
     ret = sPathXMLFilesDefault; 
    } 

    return ret; 
} 

注:

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

はその後、これはUtilies.dllで宣言された関数getPathXMLFilesである私は、関数getNodeTextValue、ヒープを呼び出さない場合こちら腐敗は起こらない。だから、そこgetPathXMLFilesと同じDLLにある関数getNodeTextValueです:

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

処理中にいくつのCRTがありますか?あなたは1つに割り振っていて、別のもので割り当てを解除していますか? –

+0

破損が検出されたコード内の場所は、破損が発生した場所であることはめったにありません。 crtdbg.h –

答えて

8

通常の理由(Windowsの場合)は、1つのDLLにメモリを割り当て、解放するときに別のDLLに渡すことです。多くの場合、これは問題ありませんが、各DLLが異なるCRT(Cランタイムライブラリ)で構築されている場合は、このような問題が発生します。その理由は、デバッグCRTは、リリースCRT(主にバッファオーバーランなどを表示するためにガードブロックを持つすべてのallocをパディング)とは少し異なる方法でメモリ割り当てを行います。

したがって、両方のDLL(およびアプリケーション)がすべて同じCRTで構築されていることを確認してください。

+0

のようにこの問題を解決するには良いデバッグアロケータを使用してください。 "だから、両方のDLL(とあなたのアプリケーション)がすべて同じCRTでビルドされていることを確認してください。"同じモジュールで割り当てと割り当てを解除することができるかどうかを確認することができます。 –

+0

私はCRTをチェックしました。 2つのDLLは/ MTに、私のアプリは/ MDにありました。だから、私は/ MDに私のdllのCRTを変更し、それは良い仕事です。あなたがた両方に感謝します ;-) – Cedekasme

関連する問題