Управление памятью полиморфных синхронизированных событий с помощью DLL - PullRequest
0 голосов
/ 10 января 2011

Вот моя проблема.

Моя библиотека Gui, которую я сделал, поддерживает синхронизированные события.По сути, у меня есть класс TimedEvent, от которого наследуются пользователи.Затем они делают:

addTimedEvent(new DerivedTimedEvent(...));

Однако, учитывая природу временных событий, я впоследствии управляю памятью.

Поэтому, когда временное событие сделало свое дело, моя библиотека вызывает на нем команду delete.Хотя он работает нормально, это потому, что exe и библиотека были собраны с msvc 2008. Я думаю, у меня могут возникнуть проблемы, если у меня есть 2 версии среды выполнения, одна для lib и одна для exe.

Что я могу сделать, чтобы это исправить?Я не могу создать фабрику, потому что производный тип находится на стороне exe вещей.Я также не могу попросить пользователя вызвать команду delete, поскольку у него может не быть возможности отслеживать время или знать, было ли событие отложено по какой-либо причине.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 января 2011

Попробуйте получить объект Dellocator Functor в качестве параметра построения для вашего класса TimedEvent. Теперь каждый клиент, создающий производный класс, должен предоставлять 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);
}
0 голосов
/ 10 января 2011

Объект boost :: shared_ptr может это сделать. Причина в том, что средство удаления создается на строительной площадке, поэтому будет вызываться соответствующая версия, даже если у вас запущен fubar среды выполнения c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...