是否应该从库或客户端代码中删除加载库中的对象实例?

时间:2014-02-13 14:44:28

标签: c++ native loadlibrary

在我的解决方案中,我通过导入的函数从动态加载的DLL中获取了几个对象指针:

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));  
}

实际问题是什么被认为更正确和/或更方便?

  • 向DLL库提供额外的导出函数,如releaseInstance(PluginBase *)并使用它。
  • 从客户端代码中删除实例指针。

此致

3 个答案:

答案 0 :(得分:1)

为了良好的封装/秘密隐藏,我更喜欢第一种方法(即提供自定义删除方法)。您可以获得更多灵活性,例如果对象创建很昂贵,您可能会有一些对象池,createInstance方法从该对象池返回一个自由对象。不是实际删除对象,而是在发布时进行简单的重置。

根据您的情况,可能很明显您永远不会需要这样的东西(如果您只在少数地方使用此方法)。然而,由于它没有为这种封装带来很多复杂性,我可能更喜欢大多数情况下的第一种方法。

答案 1 :(得分:1)

提供删除。

它清除了关于用户应该如何删除对象的任何混淆(deletefree(它毕竟来自extern "C"调用)?)

而且,在某些版本的Visual Studio中,运行时库的工作方式可能会取决于编译器选项,这意味着不能 delete一个模块中的对象是new在另一个。{/ p>

比任何一个选项都好(IMO):返回已使用适当的删除器初始化的shared_ptr

答案 2 :(得分:1)

创建的详细信息仅为DLL所知。

客户端无法知道他们必须采取哪些措施来妥善处理对象。

可以预期DLL将提供一种正确处理对象的方法,即使在创建时没有特殊原因,客户端也不应该自己删除它。

创建和处理的方式将来可能会发生变化,如果没有给出在早期版本中处理对象的方法,客户端的代码将会中断。