两个dll之间的堆损坏
Heap corruption between two DLLs
当我在释放模式下编译时,在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
,堆损坏不会发生。因此,函数getNodeTextValue
与getPathXMLFiles
在同一个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构建的
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- C++和Python之间的数据损坏管道
- 无法理解工作代码和损坏代码之间的区别
- 两个dll之间的堆损坏
- 在两个不同线程之间的信号/槽调用后损坏QImage