0

我有一个 Qt 应用程序,它使用另一个库,其中函数输出是 std::string 而不是 QString。

所以在我的程序中我有一个方法

void doSomething() {
...
std::string std_string = MyExternalLibraryThatReturnsSTLstring.getString();
QString myQString = QString::fromStdString(std_string);
...
process(myQString);
...
}

当我的外部库返回非空 std::string 时,一切正常。但是当返回一个空的 std::string 时,应用程序会在范围结束时崩溃。我猜这与 std::string 对象(?)的破坏有关。

到 QString 的转换工作正常,即使是空的 std::string。

有人能告诉我为什么会发生这种情况,以及如何避免这个运行时错误吗?

(在其他线程中,有些人讨论了调试和发布库的混合,但我认为我没有这样做。如何找出 btw?)

4

3 回答 3

1

解决方案是确保您的 Qt 版本使用与您的应用程序相同的编译器进行编译。

就我而言,我下载了用 VS2008 预构建的 Qt 4.7.3。当我迁移到 VS2010 时,toStdString 导致我的应用程序崩溃。STL 字符串也会出现其他一些奇怪的错误。

因此,只需配置您的发行版,然后使用 VS2010 编译器重新制作即可。

于 2011-12-13T21:08:07.347 回答
0

使用“dependency walker”查看您的应用程序(以及外部 DLL 和 QT DLL)依赖于哪个 DLL。

于 2010-02-25T11:03:17.027 回答
0

您需要使用 Dependency Walker(Patrick 建议)查看不同版本的 msvc 运行时库(msvcrt 和朋友),以及它们是否被碰巧在它们之间交换内存的不同 dll 使用。

这是至关重要的部分,因为堆保存在运行时 dll 中,每个运行时都会有自己的堆(即对于 vs 2008、2010、2005)。

因此,如果您在一个 dll 中分配内存(例如通过创建一个包含超过 16 个左右字符的 std::string)并将其发送到另一个 dll 中(在作用域结束时),删除调用将转到不同于新的堆:ed,然后崩溃。

因此,为了在 Windows 上跨 DLL 的 STL 兼容性,必须使用相同的编译器。

如果 DLL 公开了一个 API,它总是可以释放它自己的内存,那么就不存在这样的问题。(即认为COM,或类似但不那么可怕的东西)。

也可能存在 ABI 不兼容,但我不太确定。多年来,我大多被内存分配/释放问题所困扰。

于 2011-12-13T21:33:23.870 回答