2017-01-21 4 views
0

У меня есть унаследованный класс, чье жизненное время управляется подсчетом ссылок (точнее, это результат ACE_Event_Handler).Как использовать shared_ptr и пользовательский подсчет ссылок одновременно?

Я хочу, чтобы иметь возможность управлять им с помощью std :: shared_ptr в моем коде, но все равно сохранить старый счетчик ссылок устаревшего (объекты класса должны быть доступны сторонней библиотекой, которая не принимает shared_ptr - ACE, если быть точным).

Объект должен быть удален, когда счетчик ссылок падает до 0, и все экземпляры shared_ptr, управляющие им, будут уничтожены.

У меня есть только одна идея: сохраните экземпляр shared_ptr, указывающий на объект, пока счетчик ссылок не упадет до 0, а затем сбросит его. Каким-то образом это ощущение грязности. Есть ли способ лучше?

+0

Почему бы не написать умный указатель, который обрабатывает увеличение и уменьшение количества ссылок ACE и использование этого? Это достаточно легко. –

+0

Я хотел бы использовать std :: shared_ptr. – Gbr

+0

Что-то вроде ['boost :: intrusive_ptr'] (http://www.boost.org/doc/libs/1_63_0/libs/smart_ptr/intrusive_ptr.html) выглядит лучше, чем' std :: shared_ptr'. Если boost не является опцией, то ваш собственный «instrusive_ptr» -подобный класс, вероятно, является вашим единственным вариантом. –

ответ

0

Обычный подход состоял бы в том, чтобы иметь собственный пользовательский проект ptr с ACE_Event_Handler::add_ref() в конструкторе и ACE_Event_Handler::release() в деструкторе.

В качестве альтернативы, вы можете использовать std::unqiue_ptr с пользовательских Deleter:

template<typename T> 
struct custom_releaser 
{ 
    void operator()(T *p) { if (p) p->release(); } 
}; 

std::unique_ptr<T, custom_releaser<T>> my_ptr; 

Если вы действительно хотите std::shared_ptr:

std::shared_ptr<T> ptr = std::shared_ptr(std::move(my_ptr)); 

Интересно, однако, если он будет правильно называть ACE_Event_Handler::add_ref(). Я думаю, std::shared_ptr будет ссылаться на его собственную переменную-член, так что вам нужно будет предоставить метод для создания ACE_Event_Handler::add_ref() при создании экземпляра и добавлении количества ссылок.

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

  • Нет связанных вопросов^_^