在我的解决方案中,我通过导入的函数从动态加载的DLL中获取了几个对象指针:
extern "C"
API_EXPORT PluginBase* createInstance(const string& typeName)
{
return TypeRegistry::instance().getTypeInstance(typeName);
}
HMODULE lib = LoadLibrary("theDll.dll");
void* proc = GetProcAddress(lib, "createInstance");
if(proc)
{
auto createFunc = reinterpret_cast<T* (*)(const string&)>(proc);
shared_ptr<PluginBase> instancePtr(createFunc(theType));
}
实际问题是什么被认为更正确和/或更方便?
此致
答案 0 :(得分:1)
为了良好的封装/秘密隐藏,我更喜欢第一种方法(即提供自定义删除方法)。您可以获得更多灵活性,例如果对象创建很昂贵,您可能会有一些对象池,createInstance
方法从该对象池返回一个自由对象。不是实际删除对象,而是在发布时进行简单的重置。
根据您的情况,可能很明显您永远不会需要这样的东西(如果您只在少数地方使用此方法)。然而,由于它没有为这种封装带来很多复杂性,我可能更喜欢大多数情况下的第一种方法。
答案 1 :(得分:1)
提供删除。
它清除了关于用户应该如何删除对象的任何混淆(delete
?free
(它毕竟来自extern "C"
调用)?)
而且,在某些版本的Visual Studio中,运行时库的工作方式可能会取决于编译器选项,这意味着不能 delete
一个模块中的对象是new
在另一个。{/ p>
比任何一个选项都好(IMO):返回已使用适当的删除器初始化的shared_ptr
。
答案 2 :(得分:1)
创建的详细信息仅为DLL所知。
客户端无法知道他们必须采取哪些措施来妥善处理对象。
可以预期DLL将提供一种正确处理对象的方法,即使在创建时没有特殊原因,客户端也不应该自己删除它。
创建和处理的方式将来可能会发生变化,如果没有给出在早期版本中处理对象的方法,客户端的代码将会中断。