【发布时间】:2013-09-18 21:35:32
【问题描述】:
我正在调用一个静态链接的 .dll,我看到了这个错误:
我编写了 .dll 和调用代码。不应发生此错误。我想知道是否有人以前遇到过它? .dll 仅包含大约 10 行代码,它只是一个测试 .dll,以了解 dll 一般如何工作。当我将 std::string 从 .dll 中传回时,它会爆炸。
我正在使用 Visual Studio 2012 和 C++。
接下来我会尝试什么
来自Debug assertion... _pFirstBlock == pHead:
如果使用单线程库,可能会出现此问题 多线程模块。
明天,我将尝试在多线程模式下重新编译 Boost 静态库(我的 .dll 设置为多线程静态模式)。
接下来我会尝试什么
见Using strings in an object exported from a DLL causes runtime error:
你需要做两件事之一
- 使 DLL 和使用它的客户端都链接到 CRT 的 DLL 版本(例如,不是静态的)。
- 或者您需要确保不会跨 DLL 边界传递动态分配的内存(例如包含在字符串对象中)。 换句话说,不要有返回字符串的 DLL 导出函数 对象。
乔
这似乎与正在发生的事情相匹配,它在我将字符串传递回 .dll 边界的精确点处爆炸。仅当所有内容都以静态模式链接时才会出现此问题。现在可以解决了。
见Passing reference to STL vector over dll boundary。
接下来我会尝试什么
见Unable to pass std::wstring across DLL。
解决方案
我有一个很好的解决方案,请参阅下面的答案。
【问题讨论】:
-
您的具体问题是什么?
-
这表明你有堆损坏。什么会导致堆损坏?至少有一百万种不同的东西。如果您发布一些代码,也许有人可以提供帮助。
-
但这显然正在发生。您是否声称自己无法编写破坏堆的代码?
-
即使你认为它不应该发生,它显然是。所以你的代码有 99.9% 的可能有问题...
-
刚刚在搜索引擎中输入了错误。一些有趣的热门歌曲,例如casablanca.codeplex.com/discussions/442262,“那个堆栈跟踪对我来说太熟悉了——标准字符串的布局在不同配置的运行时二进制文件之间有所不同。如果我是一个赌徒,我敢打赌你有一个混合的发布和调试二进制文件在你的执行文件夹中。”还有stackoverflow.com/questions/15524591/…。从本质上看,您的 exe 和 dll 的构建方式可能不匹配。