【发布时间】:2015-09-07 18:49:14
【问题描述】:
我正在尝试从 DLL 中导出一个类。我在这样做时阅读了这篇文章:http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
“成熟”的方法建议使用抽象类,所以我有:
// Header
class IFoo{
public:
virtual int getBar() = 0;
}
class Foo: public IFoo {...}
DLLEXPORT IFoo* Create();
DLLEXPRT void Free(IFoo* inst);
//DLL cpp
IFoo* Create(){ return new Foo; }
void Free(IFoo* inst){ delete inst; }
让我困惑的是:如果我没有虚拟析构函数,那么delete inst 不会调用 Foos 析构函数并且可能会泄漏内存。我该怎么处理?这篇文章没有给出答案。
使用 virtual ~IFoo(){} 是不可能的,因为这会向 IFoo 添加一个实现,这会导致问题(在文章中关于内联虚函数的问题的答案中进行了解释),并且 virtual ~IFoo() = 0; 失败并出现未定义的链接器错误符号~IFoo
什么是安全的方法? Free/Release功能应该如何实现?
【问题讨论】:
-
不要让事情变得过于复杂。只需在
IFoo中提供一个虚拟析构函数并导出它的定义。 -
您可以在界面中添加一个虚拟的 Free() 函数。将 inst 转换为 Foo* 是另一种方式,不是更好。
-
@HansPassant:为什么不简单地使用虚拟析构函数?
-
我只是给他子弹,装枪是他的事。
标签: c++ dll destructor dllexport pure-virtual