【问题标题】:std::string is totally crashing in msvcp90d.dllstd::string 在 msvcp90d.dll 中完全崩溃
【发布时间】:2012-11-14 10:16:14
【问题描述】:

该库正在使用 std::string。当某些特定的应用程序与它链接时,在库中执行的字符串操作变得完全崩溃。

例如字符串赋值运算符'='(附加堆栈跟踪)。

memcpy_s( ... ) 的目的地和大小看起来很混乱。

我们无法在本地复制它。请指教。

编辑: 代码如下所示:

...
#define DEFAULT_VAL "value"
...
class MyClass {
public:
 MyClass(const std::string& s=DEFAULT_VAL)
 {
  _test() = s;
 }
protected:
 inline const std::string& test() const {return m_test;}
 inline std::string& _test() {return m_test;}
private:
 std::string m_test;
};

....
MyClass c;

【问题讨论】:

  • 这看起来像是由于访问越界、堆栈损坏、释放后访问、双重释放等导致的内存损坏。 valgrind(或类似工具)是你的朋友。
  • 0xCD 是 Microsoft 调试堆中的干净内存填充器。所以我的猜测是您的应用程序在某处使用了未初始化的对象。
  • 共享显示错误的代码块可能有助于调试。只是说'
  • 为什么要在客户站点运行调试版本?

标签: c++ dll crash std stdstring


【解决方案1】:

您可能正在使用 0 初始化 std::string(或 std::wstring),很可能是通过空指针,例如……

#include <string>
using namespace std;

int main()
{
    string s1( 0 );
    string s2 = s1;
}

不要那样做。

没有很多其他方法可以让std::string“崩溃”,所以很可能就是这样。现在去调试吧!祝你好运!

【讨论】:

  • 它发生在客户的机器上,我们无法重现。会不会是crt不匹配?
  • @Cheers:根据问题中的截图和问题标题本身(提到msvcp90d.dll),OP使用的是调试版本的CRT。并且(至少在 VS2010 中),如果您尝试使用 0/nullptr 初始化 std::string,您会收到带有 “Debug Assertion Failed!” 消息的错误消息框,并且正确的“表达式:无效的空指针” 文本。我认为实际问题可能是 EXE 和 DLL 使用的 CRT 版本/风格不匹配。
  • 他说如果他与我们的 /MDd 库链接它工作得很好。但是我们的 /MD 库崩溃了。
  • 酷,我能够重现与 /MDd 测试应用程序链接时的崩溃。
  • @ActivationCloud:这是调试/发布版本不匹配的问题吗? /MDd 动态链接 CRT DLL 的调试版本,而 /MD 动态链接发布版本。
【解决方案2】:

如果您遇到的 DLL 在接口处暴露 std::string,请确保 .EXE 和 .DLL 均使用 相同 编译器版本和 与 CRT 相同的 风格(例如,都调试,都发布,都具有相同的 _HAS_ITERATOR_DEBUGGING 设置等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2015-05-25
    • 1970-01-01
    • 2013-03-14
    • 2020-11-11
    • 2021-05-14
    相关资源
    最近更新 更多