【发布时间】:2014-02-05 18:56:32
【问题描述】:
我正在开发一个项目,该项目应该能够在运行时通过dlopen 加载动态链接库。
核心框架已经完成,它确实在工作,但我对如何正确管理库在堆上分配的对象有些疑问。库的接口只有一个方法,它返回指向库内静态分配的对象的指针,该对象是具有virtual 方法的公共类的子类型
为了更好地解释它,我将提供一个我希望它如何工作的存根:
// header common to the core and to the libraries
class BaseSetting {
..
}
class DerivedSetting1 : public BaseSetting { .. }
class DerivedSetting2 : public BaseSetting { .. }
class ObjectInterface {
private:
vector<BaseSetting*> settings;
protected:
void registerSetting(Setting *setting) { settings.push_back(setting); }
public:
vector<Setting*> *getSettings() { return &settings; }
}
// library example
class ConcreteObject {
ConcreteObject() {
registerSetting(new ..);
registerSetting(new ..);
}
static ConcreteObject object;
extern "C" ConcreteObject *retrieve() { return &object; }
这里的主要问题是我应该如何管理库的堆分配设置?我需要多态性,所以我不能只将具体对象存储在向量中,同时我需要在需要时在库之间切换,通过使用dlclose 卸载当前,并释放与它们关联的所有内存。我可以使用unique_ptr,但这会使事情复杂化,因为我只需通过get() 获取原始指针就可以从核心使用它们,这会破坏任何所有权。
是否有处理此类情况的通用设计模式?
【问题讨论】:
标签: c++ c dynamic-linking