【问题标题】:Should destructors be exported in Windows DLL Libraries?是否应该在 Windows DLL 库中导出析构函数?
【发布时间】:2009-08-06 17:13:11
【问题描述】:

在生成 Windows DLL 动态库时,系统会要求您声明应导出哪些函数,以便某些函数可能保留为 DLL 私有,其他应用程序无法访问。

我还没有看到关于析构函数是否需要导出或者它们是否由编译器或 Windows 内核自动处理的任何内容?就像我不导出析构函数并且他们动态分配一个我声明为可导出的类一样,如果不导出析构函数,他们能否成功对其调用 delete?

【问题讨论】:

    标签: c++ dll shared-libraries


    【解决方案1】:

    一般来说,任何具有构造函数的类也应该导出析构函数。

    话虽如此,这里有几件事需要注意......

    如果您在 Windows 上构建,则需要小心将 VS 版本与库混合使用。如果您只想将库作为 DLL 分发,那么导出构造函数和析构函数是个坏主意。问题出在 C++ 运行时。几乎要求处理内存分配的同一运行时需要处理释放。例如,当您尝试在 VS 2008 中使用在 VS 2005 中编译的库时,这是导致“坏事”的第一大原因。

    解决方案是提供工厂方法来创建您的类(分配由您编译的运行时处理)以及删除/销毁您的类的方法(因此解除分配发生在同一个运行时)。

    【讨论】:

    • 走工厂函数路线也开启了DLL被非C++程序消耗的可能性,希望大家认为是件好事。
    • 好的,一般来说,导出析构函数可能是一件坏事。我实际上计划使用因子方法进行创建,所以我可能会继续这样做。另外为了清楚起见,你们能否解释一下为什么同一个运行时取消分配和分配是一件如此糟糕的事情?
    • @IQ:如果 VC2005 运行时删除了由 VC2008 运行时分配的内容,您可能会遇到(偶尔且很难跟踪)导致内存损坏、崩溃等问题的错误。运行时一致可以防止这种情况发生。
    【解决方案2】:

    如果析构函数不可用但需要,编译器应该生成错误。作为一般规则,如果你的构造函数被导出,你的析构函数也应该被导出。

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 2011-04-28
      • 2011-04-07
      • 2014-09-25
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多