2009-12-20 4 views
1

Недавно я реализовал экран «Приостановил» в своей игре. Поскольку я хотел, чтобы это было отдельное состояние игры, мне нужно было как-то сохранить данные, когда игрок приостановил игру до того, как они снова вошли. Однако при переключении состояний указатель на предыдущее состояние удаляется.Нечеткое поведение при передаче копии через '* this'

Таким образом, я решил, что конструктор Paused возьмет копию уровня (класс), чтобы он мог удерживать его, пока пользователь не решит возобновить работу. Затем он установил следующее состояние, используя этот уровень, который был скопирован.

Код для установки следующего состояния приостановленной выглядит следующим образом ...

p_Game->SetNextState(new Paused(*this)); 

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

Программа вылетает всякий раз, когда выполняется операция с указателем Босса, которая возникает во время логики выполнения и части рендеринга уровня, но до того, как игровое состояние переключится на паузу. Обратите внимание, что этот указатель Босса выделяется при построении Уровня и освобождается от разрушения. Может ли передача копии текущего уровня каким-то образом испортиться, указатель удерживается в переменной-члене?

+0

Похоже, что вы страдаете от плохого случае указателя наркомании. Вы на самом деле пытаетесь * собрать как можно больше утечек памяти? Что было бы неправильно с структурированием вашего кода следующим образом: 'game.SetNextState (Paused (* this));' – jalf

ответ

7

Вы определили фактический конструктор копирования, который глубоко копирует объект уровня, создавая новый объект Boss и т. Д.?

Или вы использовали только тот, который автоматически предоставляется компилятором, который является мелкой копией?

Если последнее, в этом случае вы сталкиваетесь с проблемами: поскольку это мелкая копия, указатель на объект Boss на новом уровне указывает на тот же объект Boss, что и на уровне, который вы копируете. но этот объект Boss освобождается, когда ваш исходный объект уровня (а не копия, а копия) уничтожает.

Даже если вы написали свой собственный конструктор, вам все равно нужно убедиться, что вы делаете глубокую копию вместо мелкой копии.

Больше на копировальных конструкторах: link

+0

Спасибо. Информационный и правильный пост. – Anonymous

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