gpt4 book ai didi

c++ - GCC/Windows DLLs/C++ STL 前端有什么改进吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:39 24 4
gpt4 key购买 nike

昨天,在 Cygwin 下使用 GCC 编译的 DLL 时,我遇到了一个相当烦人的崩溃。基本上,一旦您使用调试器运行,您可能最终会陷入调试陷阱,原因是 RtlFreeHeap() 接收到一个它未分配的地址。

这是 Cygwin 上的 known bug with GCC 3.4。出现这种情况是因为 libstdc++ 库包含对空字符串的“巧妙”优化。我省去了你的细节(请参阅这篇文章中的引用资料),但是每当你在一个 DLL 中为“属于”另一个 DLL 的 std::string 对象分配内存时,你最终会给一个堆一个 block 来释放来自另一堆。因此 RtlFreeHeap() 中的 SIGTRAP

当跨 DLL 边界抛出异常时,还会报告其他问题。

一旦您的项目基于 DLL 和 STL,这会使 Windows 上的 GCC 3.4 成为 Not Acceptable 解决方案。我有几个选项可以跳过此选项,其中许多选项非常耗时和/或烦人:

我不能(还)切换到另一个编译器,因为我正在使用一些其他工具。我从一些 GCC 人员那里发现的评论是“几乎从未被报道过,所以这可能不是问题”,这让我更加恼火。

有人对此有消息吗? 除了 GNU Radio bug tracker 上的一条评论外,我找不到任何明确的公告表明此问题已得到修复(错误仍标记为“已分配”)。

谢谢!

最佳答案

您遇到的一般问题是 C++ 从来就不是真正意义上的组件语言。它实际上是为创建完整的独立应用程序而设计的。诸如共享库和其他此类机制之类的东西是由供应商自己创建的。想一想这个例子:假设您创建了一个返回 C++ 对象的 C++ 组件。 C++ 组件如何知道它会被 C++ 调用者使用?如果调用方是 C++ 应用程序,为什么不直接使用库呢?

当然,以上信息并不能真正帮助到你。

相反,我会创建共享库/DLL,以便您遵循几条规则:

  1. 任何由一个组件创建的对象也会被同一个组件销毁。
  2. 当组件创建的所有对象都被销毁时,组件可以安全地卸载。

您可能必须在您的组件中创建额外的 API 来确保这些规则,但通过遵循这些规则,将确保不会发生上述问题。

关于c++ - GCC/Windows DLLs/C++ STL 前端有什么改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com