系统相关
首页 > 系统相关> > 在GCC / Windows DLL / C STL方面是否有任何改进?

在GCC / Windows DLL / C STL方面是否有任何改进?

作者:互联网

昨天,当我在Cygwin下使用通过GCC编译的DLL时,我感到非常烦人的崩溃.基本上,使用调试器运行后,最终可能会陷入由RtlFreeHeap()接收到未分配地址的地址导致的调试陷阱.

这是Cygwin上的known bug with GCC 3.4.之所以出现这种情况,是因为libstdc库包括针对空字符串的“巧妙”优化.我为您保留了详细信息(请参阅本文中的所有参考资料),但是每当您在一个DLL中为“属于”另一个DLL的std :: string对象分配内存时,您最终都会给一个堆释放来自以下对象的块:另一个堆.因此,RtlFreeHeap()中的SIGTRAP.

跨DLL边界引发异常时,还会报告其他问题.

一旦您的项目基于DLL和STL,这将使Windows上的GCC 3.4成为不可接受的解决方案.我有几个选项可以超越此选项,其中许多都是非常耗时和/或令人讨厌的:

>我可以patch my libstdc++rebuild it with the –enable-fully-dynamic-string配置选项
>我可以改用静态库,这会增加链接时间

由于我正在使用其他一些工具,因此我也无法切换到另一个编译器.我从一些海湾合作委员会人员那里发现的评论是:“几乎从未报告过,因此这可能不是问题”,这使我更加恼火.

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

谢谢!

解决方法:

您遇到的一个普遍问题是C从未真正作为一种组件语言使用.它的真正目的是用来创建完整的独立应用程序.诸如共享库之类的东西以及其他此类机制是由供应商自己创建的.想想这个例子:假设您创建了一个返回C对象的C组件. C组件如何知道C调用者将使用它?如果调用者是C应用程序,为什么不直接使用该库呢?

当然,以上信息并不能真正帮助您.

相反,我将创建共享库/ DLL,以便遵循以下规则:

>由组件创建的任何对象也会被同一组件破坏.
>销毁所有创建的对象后,可以安全地卸载该组件.

您可能必须在组件中创建其他API来确保遵循这些规则,但是通过遵循这些规则,可以确保不会发生上述问题.

标签:c,string,gcc,dll,libstdc
来源: https://codeday.me/bug/20191011/1892294.html