shared_ptr цепочка / ветка со вторым удалителем - PullRequest
1 голос
/ 28 октября 2011

У меня есть ситуация, когда мне нужно знать, когда завершен пользователь shared_ptr, то есть когда пользователь наконец выпустил все его копии. Обычно здесь используется только средство удаления, но в этом случае есть небольшая хитрость. Базовый объект уже является shared_ptr!

То есть в псевдокоде:

shared_ptr<T> a( new T );
.
.
.
shared_ptr<T> b( a, bind( delete_func, id ) );

Я порождаю новую ветку своего рода из оригинального shared_ptr. Этот новый shared_ptr b может быть скопирован и использован как обычный shared_ptr, но delete_func должен быть вызван, когда эта конкретная ветвь завершена. Теперь я не могу просто использовать a.get() здесь, так как этот новый shared_ptr должен также сохранять базовый объект (это может быть последний shared_ptr для него).

Я ищу способ сделать это без необходимости кардинально менять структуру. Кто-нибудь видит хорошее простое решение?

Я использую библиотеку наддува для интеллектуальных указателей и привязки.

Ответы [ 2 ]

0 голосов
/ 28 октября 2011

Я не совсем понимаю, почему вы хотите иметь два отдельных слоя shared_ptr, почему бы просто не предоставить соответствующий удалитель, который уведомит вас, а затем вызвать checked_deleter на указателе?Таким образом, вам нужен только один удалитель, и вы вернулись к простой задаче один удалитель для shared_ptr.

0 голосов
/ 28 октября 2011

Я придумал одно возможное решение.

Создайте функцию удаления, подобную этой:

void delete_func( int id, shared_ptr<T> underlying );

Затем, чтобы связать shared_ptr, сделайте следующее:

shared_ptr<T> b( a.get(), bind( &delete_func, id, a ) );

Это создает новый неприсоединенный shared_ptr с пользовательским удалителем (моя ветка).Одним из параметров является исходный shared_ptr, поэтому он также должен поддерживать базовый объект shared_ptr.Теперь мне просто нужно немного это проверить.

...