Вызов удаляет на двух указателях на тот же объект

У меня есть проблема с несколькими классами обработчика событий, которые я пытаюсь записать. В основном идея состоит в том, чтобы иметь класс обработчика событий для каждой логической группы объектов. В большинстве случаев события между объектами и их обработчиком, но в некоторых случаях события также отправляются между объектами-обработчиками также.

Я написал код, таким образом, что события помещаются в стек (стек, поскольку в пользователе создал структуру; сами события выделяются с помощью new) и deleted после того, как их информация читается и реагируется. Это дает мне некоторые проблемы, потому что в одном случае, событие отправляется вдоль цепочки трех обработчиков. Скажите, HandlerA отправляет a new Event кому: HandlerB, который помещает его в стек и читает его, отправляя его в HandlerC, который читает его и выполняет то, что это должно выполнить, после который это deletes указатель События и наборы это к NULL. Теперь, мы появляемся назад к HandlerB и, ну, в общем, это также хочет delete и NULL указатель на событие. Но указатель является локальной переменной, и он заканчивает тем, что удалил тот же адрес дважды, давая исключение.

Как Вы обходите это? Необходимо ли использовать одного из тех, полагают auto_ptrs (все еще ранний ученик здесь), или я пропускаю что-то фундаментальное здесь?

5
задан Brian Tompsett - 汤莱恩 8 July 2015 в 21:45
поделиться

3 ответа

Я написал код, чтобы события помещались в стек и удалялись после их информации читается и действует.

Здесь есть некоторая путаница - объекты в стеке должны не быть удаленными d. Объекты, созданные с помощью new (в куче), должны.

В общем, вы должны определить четкую стратегию владения вашими объектами в куче. У каждого объекта должен быть один владелец, и должно быть ясно, кто владелец в любой момент времени. Этот владелец - и только он - должен удалить объект.

Вы также можете использовать boost :: shared_ptr (он может быть также доступен как std :: tr1 :: shared_ptr , в зависимости от вашего компилятора) вместо необработанных указателей. Он ведет счетчик ссылок на объект и удаляет его, когда счетчик ссылок падает до 0.

10
ответ дан 18 December 2019 в 09:47
поделиться

Проблема, как я ее вижу, в том, что нет четкого владельца указателя. Одним из решений будут умные указатели, как указано в ответе inflagranti. В качестве альтернативы вы можете перестать пересылать событие дважды - когда обработчик (обработчик B в вашем примере) получает событие, которое ему нужно переслать другому обработчику, он создает новое событие, а не передает указатель на существующее событие.

Тем не менее, если вы готовы потратить время на их изучение, я думаю, что решение Smart Pointer, вероятно, лучше!

1
ответ дан 18 December 2019 в 09:47
поделиться

Вам нужна некоторая оболочка указателя, которая для экземпляров использует подсчет ссылок, чтобы проверять, ссылаются ли другие переменные на тот же экземпляр. Идея состоит в том, что объект, на который указывает указатель, освобождается только тогда, когда этот объект не используется никаким другим указателем. Такие указатели обычно называют интеллектуальными указателями . В C ++ вы можете, например, использовать те, которые предоставляются Boost .

6
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: