Указатели в C ++ Class зашифрованы - PullRequest
1 голос
/ 26 октября 2011

У меня сейчас много кода, который сводит меня с ума. Я работаю с OpenGL, создавая структуру GUI, которая использует несколько различных типов объектов. У меня есть классы изображений, которые загружают файлы * .png и хранят информацию об изображениях в виде ссылки на текстуру GLuint. У меня есть классы Panel и Button с указателями на классы изображений, которые они должны отображать. У меня есть класс Hud с std :: векторы указателей Panel и Button. Наконец, у меня есть класс Engine, который содержит один класс Hud, все мои классы Button и Panel и указатели на изображения. Когда конструктор запущен, каждый из указателей Image инициализируется с помощью:

imgMy = new Image;

Как только все изображения были инициализированы, я запускаю свои функции загрузки:

imgMy->loadImage("imgMy.png");

Конечно, я удаляю изображения, когда закрываю программу.

Моя проблема в том, что некоторые изображения "пересекаются". У меня сейчас около тридцати изображений, и пара кнопок, очевидно, указывают на неправильные изображения. Я тщательно проверил свой код, и он кажется надежным. Я считаю, что это ошибка памяти, так как кнопки, которые отображают неправильные изображения, несовместимы. Иногда они отображают правильные изображения, иногда разные кнопки отображают неправильные изображения. Я бы хотел показать свой код здесь, но он довольно массивный.

Причина, по которой я использую указатели Image в своем классе Engine вместо реальных объектов Image, заключается в том, что я боюсь, что кнопки указывают на недопустимую память, если размер класса Engine изменяется или его память переупорядочивается. Я подозреваю, что есть гораздо лучший подход к тому, чего я пытаюсь достичь, и я был бы признателен за любые советы в этом направлении.

Ответы [ 4 ]

2 голосов
/ 26 октября 2011

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

Вы можете просто использовать const для его принудительного исполнения.

class Button {
    const std::unique_ptr<Image> img;
public:
    Button(std::string filename)
        : img(new Image(filename)) {}
};

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

2 голосов
/ 26 октября 2011

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

Вы также можете попробовать valgrind, но это не похоже на тип проблемы, которую найдет valgrind.

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

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

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

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

Звучит как повреждение памяти.Вам следует рассмотреть возможность использования некоторого отладчика памяти, например valgrind или , другой альтернативы Если у вас есть какие-либо проблемы с использованием указателей, эти инструменты помогут вам их отследить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...