这是我的问题。
我制作的我的Gui库支持定时事件。基本上,我有一个名为TimedEvent的类,用户继承自该类。然后他们这样做:
addTimedEvent(new DerivedTimedEvent(...));
然而,考虑到定时事件的性质,我之后会管理内存。
所以当定时事件完成后,我的库会调用delete。虽然它运行正常,这是因为exe和库都是用msvc 2008构建的。我想如果我有两个版本的运行时,一个用于lib,一个用于exe,我可能会遇到麻烦。
我该怎么做才能解决这个问题?我无法创建工厂,因为派生类型是在exe的一面。我也不能要求用户拨打删除,因为他们可能无法跟踪时间,或者知道事件是否因任何原因而被延迟。
由于
答案 0 :(得分:1)
尝试将Dellocator Functor对象作为TimedEvent类的构造参数。现在,每个创建派生类的客户端都应该提供一个可以在删除对象时调用的Dellocator。您还应该使用默认的dellocator仿函数,它只是作为一个特例删除。
class base;
class Deallocator {
void operator()(base* ptr)
{
delete ptr;
}
}
class base {
public:
base(Deallocator dealloc)
{
m_deleteFunc = dealloc;
}
~base()
{
m_deleteFunc(this);
}
private:
Deallocator m_deleteFunc;
}
int main
{
Deallocator deletefunc;
base baseObj(deletefunc);
}
答案 1 :(得分:0)
boost :: shared_ptr对象可以做到。原因是删除器是在构造站点创建的,因此即使你已经运行了c运行时fubar,也会调用相应的版本。