головоломка shared_ptr - PullRequest
       10

головоломка shared_ptr

0 голосов
/ 06 октября 2010

Я использую платформу ACE, но я попытаюсь описать мою проблему, не ссылаясь на нее.

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

В какой-то момент времени я хочу:

  1. удалить обработчик событий из карты менеджера
  2. Некоторый метод обработчика событий должен вызываться 3-м классом, который содержит указатель строки на обработчик события (для тех, кто знаком с ACE, это handle_close (), вызываемый ACE Reactor)

Проблема в том, что порядок (1) и (2) не обещан. Если (1) вызывается до (2), (2) будет работать с обработчиком повисших событий.

Поэтому я подумал о добавлении некоторой дополнительной ссылки на обработчик событий, которая будет уменьшена в (2).

Как это можно сделать? Можно ли сохранить ссылку на обработчик события из самого обработчика события (возможно, используя enable_shared_from_this)?

Спасибо

1 Ответ

1 голос
/ 06 октября 2010

Удержание общего указателя на себя в переменной-члене отрицательно скажется на назначении shared_ptr, потому что вам нужно будет каким-то образом сообщить объекту о том, что он больше не нужен (для этого и используется «delete obj», который мы пытаемся избежатьумные указатели).Как одно из решений: замените необработанный указатель в 3-м классе на shared_ptr (или weak_ptr), если это возможно.Другие решения сильно зависят от дизайна вашего приложения, например, вы можете каким-то образом навести порядок удаления указателей из менеджера ...Попробуйте изучить этот документ http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/sp_techniques.html, возможно, вы найдете что-то полезное для вас.

...