【发布时间】:2012-12-21 13:14:30
【问题描述】:
通常,异常不得传播模块边界,例如 Herb Sutters C++ 编码标准(第 62 项)中所述。当使用不同的编译器或仅使用编译器设置编译时,这可能会崩溃。
我可以理解这个问题,例如动态链接库。但我想知道它是否也适用于静态库。就上述规则而言,静态库是模块吗?如果库是使用其他编译器设置(例如对齐)编译的,如果从静态库中抛出异常并在应用程序中捕获,程序可能会崩溃?
【问题讨论】:
-
“作为一项规则”,这只是 Herbs 的个人观点,受 FUD 的影响,甚至更糟糕的经历是他过去面临的可怕的 dll 地狱和蹩脚的编译器场景。就像他设置一个“规则”一样,你应该永远只在你新的同一个模块中删除,这也只与他用一个非常糟糕的实现所带来的糟糕体验有关。如果您正在使用理智的实现,请放弃此规则。如果您必须使用损坏的实现,请不要将其作为规则,而是作为“常见的丑陋解决方法”。
-
@KitFisto 但这适用于所有对象,而不仅仅是异常 - 所以建议不要混合不兼容的编译器。 +1 等离子HH
-
@PlasmaHH 我经常听说在与
new相同的DLL 中有关delete的限制,但它从来没有给我带来任何问题,无论是使用Microsoft 编译器还是使用g++。只要new和delete转发到malloc和free,并且malloc和free在它们自己的DLL 中(所以你不会得到它们的不同副本),应该没有问题。另一方面,dynamic_cast之类的东西可能无法跨 DLL 工作,即使它们的编译方式相同。当然,如果一个模块是用迭代器调试编译的,而另一个不是...... -
@JamesKanze:我不是 Windows 程序员,但是当您在一个使用 crt 版本的 dll 中新建/malloc 并在使用另一个版本的 dll 中释放/删除时,问题就来了crt 的版本,因为所有 crt 实例都有自己的“私有”堆
-
@JamesKanze try new std::string in a module 使用调试设置编译并在 Windows 上使用发布设置构建的模块中删除它。你不会走得太远......
标签: c++ exception static-libraries