在生成Windows DLL动态库时,系统会要求您声明应导出哪些函数,以便某些函数可能保留为DLL专用而其他应用程序无法访问。
我还没有看到有关是否需要导出析构函数或是否由编译器或Windows内核自动处理的任何内容?如果我不导出析构函数并且它们动态分配我声明为可导出的类,如果未导出析构函数,它们是否可以成功调用delete?
答案 0 :(得分:6)
通常,任何带有构造函数的类都应该导出析构函数。
话虽这么说,但有几件事要警惕......
如果您在Windows上构建,则需要注意将VS版本与库混合。如果您只是将您的库作为DLL分发,那么导出构造函数和析构函数是个坏主意。问题出在C ++运行时。几乎需要处理内存分配的相同运行时需要处理释放。例如,当您尝试在VS 2008中使用VS 2005中编译的库时,这是“坏事”的首要原因。
解决方法是提供工厂方法来创建类(分配由您编译的运行时处理)以及删除/破坏类的方法(因此解除分配在同一运行时中发生)。
答案 1 :(得分:4)
如果析构函数不可用但需要,编译器应该生成错误。作为一般规则,如果导出构造函数,那么析构函数也应该是。