image — Пользовательский оператор назначения копирования вылетает из программы (C ++)

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

«Необработанное исключение в 0x771a15de в xyz.exe: 0xC0000005: расположение чтения нарушения доступа 0xcccccd04.»

и атрибут объекта «адрес» внезапно получает значение «0x0000ffff», в то время как при использовании оператора назначения копирования по умолчанию он работает отлично.

0

Решение

Вы неправильно используете счет. SDL_FreeSurface будет уменьшать refcount, и при вызове по нулевому указателю, это no-op. Итак, ваш оператор присваивания должен выглядеть так:

const Image& Image::operator=(const Image& other){
if (img != other.img){
SDL_FreeSurface(img);
img = other.img;
if (img != NULL)
img->refcount++;
}
return *this;
}

И ваш деструктор должен выглядеть так:

Image::~Image(){
SDL_FreeSurface(img);
}

Кроме того, в вашем конструкторе по умолчанию вы должны инициализировать img нулевым указателем.

Image::Image() :img(NULL) {}

Смотрите пример со второго по последний на этой странице: http://sdl.beuc.net/sdl.wiki/SDL_Surface

2

Другие решения

Других решений пока нет …