リリースモードでコンパイルすると、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);
}
が
誰かが私に言うことができる理由、このヒープ破損それがどうやって起こるのか?
ありがとうございました。
処理中にいくつのCRTがありますか?あなたは1つに割り振っていて、別のもので割り当てを解除していますか? –
破損が検出されたコード内の場所は、破損が発生した場所であることはめったにありません。 crtdbg.h –