2017-02-02 4 views
0

У меня есть базовый класс Updater:станд :: вектор <станд :: shared_ptr <Foo>> проведение как динамически и статически выделяемый Foo

class Updater : public std::enable_shared_from_this<Updater> 
{ 
    virtual void update(void) = 0; 
}; 

с большим количеством дериватов, наиболее динамически создаются, но некоторые статически созданы. Эти зарегистрироваться, чтобы выполнить некоторые пакетные обновления в:

class DispatchGroup { 
    std::vector<std::shared_ptr<Updater>> m_dispatchList; 
}; 

Учитывая производный класс:

class UpdaterDerivate : public Updater {...}; 

Как я должен создать статически определенный экземпляр UpdaterDerivate, которое может безопасно участвовать в DispatchGroup :: m_dispatchList ?

Порядок инициализации не является проблемой (DispatchGroups могут быть созданы только динамически), поэтому проблема заключается в том, как избежать разрушения m_dispatchList, пытающегося уничтожить (и бесплатно) мои статически распределенные UpdaterDerivates.

ответ

1

Создайте его с Deleter, что делает ничего:

struct NullDeleter // Or use <boost/core/null_deleter.hpp> 
{ 
    template<class T> 
    void operator()(T*) const { /* do nothing */ } 
}; 

А потом:

UpdaterDerivate a; 
std::shared_ptr<Updater> pa(&a, NullDeleter{}); 
+0

не Разве это не требует всех, кто использует shared_from_this(), чтобы быть в курсе типа распределения? Или какой-то процесс перемещается через общие элементы shared_ptr? – Speed8ump

+0

@ Speed8ump The последний. –

+0

@ Speed8ump [std :: enable_shared_from_this] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this): _ Если объект t типа T управляется std :: shared_ptr с именем pt, то вызов T :: shared_from_this вернет новый std :: shared_ptr , который владеет правом собственности на t с pt._ –

Смежные вопросы