У меня есть проблема с несколькими классами обработчика событий, которые я пытаюсь записать. В основном идея состоит в том, чтобы иметь класс обработчика событий для каждой логической группы объектов. В большинстве случаев события между объектами и их обработчиком, но в некоторых случаях события также отправляются между объектами-обработчиками также.
Я написал код, таким образом, что события помещаются в стек (стек, поскольку в пользователе создал структуру; сами события выделяются с помощью new
) и delete
d после того, как их информация читается и реагируется. Это дает мне некоторые проблемы, потому что в одном случае, событие отправляется вдоль цепочки трех обработчиков. Скажите, HandlerA
отправляет a new Event
кому: HandlerB
, который помещает его в стек и читает его, отправляя его в HandlerC
, который читает его и выполняет то, что это должно выполнить, после который это delete
s указатель События и наборы это к NULL
. Теперь, мы появляемся назад к HandlerB
и, ну, в общем, это также хочет delete
и NULL
указатель на событие. Но указатель является локальной переменной, и он заканчивает тем, что удалил тот же адрес дважды, давая исключение.
Как Вы обходите это? Необходимо ли использовать одного из тех, полагают auto_ptr
s (все еще ранний ученик здесь), или я пропускаю что-то фундаментальное здесь?
Я написал код, чтобы события помещались в стек и удалялись после их информации читается и действует.
Здесь есть некоторая путаница - объекты в стеке должны не быть удаленными
d. Объекты, созданные с помощью new
(в куче), должны.
В общем, вы должны определить четкую стратегию владения вашими объектами в куче. У каждого объекта должен быть один владелец, и должно быть ясно, кто владелец в любой момент времени. Этот владелец - и только он - должен удалить
объект.
Вы также можете использовать boost :: shared_ptr
(он может быть также доступен как std :: tr1 :: shared_ptr
, в зависимости от вашего компилятора) вместо необработанных указателей. Он ведет счетчик ссылок на объект и удаляет
его, когда счетчик ссылок падает до 0.
Проблема, как я ее вижу, в том, что нет четкого владельца указателя. Одним из решений будут умные указатели, как указано в ответе inflagranti. В качестве альтернативы вы можете перестать пересылать событие дважды - когда обработчик (обработчик B в вашем примере) получает событие, которое ему нужно переслать другому обработчику, он создает новое событие, а не передает указатель на существующее событие.
Тем не менее, если вы готовы потратить время на их изучение, я думаю, что решение Smart Pointer, вероятно, лучше!
Вам нужна некоторая оболочка указателя, которая для экземпляров использует подсчет ссылок, чтобы проверять, ссылаются ли другие переменные на тот же экземпляр. Идея состоит в том, что объект, на который указывает указатель, освобождается только тогда, когда этот объект не используется никаким другим указателем. Такие указатели обычно называют интеллектуальными указателями . В C ++ вы можете, например, использовать те, которые предоставляются Boost .