Проблема с перегрузкой оператора - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть класс сцены с переменными-членами Image ** images, int * xcoords, int * ycoords. Теперь я пытаюсь перегрузить мой оператор =.

Я получаю следующие ошибки памяти (используя valgrind)

Conditional jump or move depends on uninitialised value(s)
==6439==    at 0x406FCA: Scene::drawscene() const (scene.cpp:160)
==6439==    by 0x4084C1: main (testscene.cpp:50)

И рассматриваемая строка сверху (scene.cpp: 160) -

if (images[i]!=NULL) 

Итак, они говорят, что изображения не были инициализированы.

И поэтому в любом другом месте вызов функции drawscene () не вызывал проблем, но я думаю, что из-за использования оператора = это вызывало проблему.

Может кто-нибудь увидеть какие-либо проблемы в моем коде, которые могут вызвать эту ошибку?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

Вам нужно это:

        if(source.images[i]!=NULL) {
            images[i]=new Image;
            *images[i]=*source.images[i];
            xcoords[i]=source.xcoords[i];
            ycoords[i]=source.ycoords[i];
        } else {
            images[i] = NULL;
        }

, и это решит вашу непосредственную проблему.Но на самом деле, вы идете об этом неправильно.Как сказал @ Gman , вы должны использовать идиому copy-and-swap .

Причиной использования этой идиомы является исключительная безопасность.Если что-то выбрасывает исключение в середине этого operator = (и есть много, что может, так как он делает так много), вы оставите объект в неопределенном состоянии, и это очень плохо.Идиома копирования и обмена позволяет написать безопасный конструктор копирования (который все еще немного сложен), а затем использовать его для построения оператора присваивания.

В качестве дополнительного бонуса вы получаете конструктор рабочей копии иswap функция.Конструктор копирования очень удобен для помещения вещей в контейнеры STL и передачи или возврата вещей по значению.А функция swap очень полезна для пользователей вашего класса, особенно для тех, кто хотел бы реализовать свои собственные конструкторы безопасного копирования исключений и операторы присваивания.

0 голосов
/ 05 февраля 2011

Вы инициализируете images[i] только если source.images[i] не равен NULL. Если source.images[i] равно NULL, вы оставляете случайный мусор в images[i]

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