使用DLL管理多态定时事件的内存

时间:2011-01-10 06:50:30

标签: c++ dll

这是我的问题。

我制作的我的Gui库支持定时事件。基本上,我有一个名为TimedEvent的类,用户继承自该类。然后他们这样做:

addTimedEvent(new DerivedTimedEvent(...));

然而,考虑到定时事件的性质,我之后会管理内存。

所以当定时事件完成后,我的库会调用delete。虽然它运行正常,这是因为exe和库都是用msvc 2008构建的。我想如果我有两个版本的运行时,一个用于lib,一个用于exe,我可能会遇到麻烦。

我该怎么做才能解决这个问题?我无法创建工厂,因为派生类型是在exe的一面。我也不能要求用户拨打删除,因为他们可能无法跟踪时间,或者知道事件是否因任何原因而被延迟。

由于

2 个答案:

答案 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,也会调用相应的版本。