Я создаю собственный класс для автоматической очистки памяти. Класс содержит указатель на объект SDL_Surface и при необходимости вызывает его refcount. Проблема заключается в том, что при реализации пользовательского оператора назначения копирования происходит сбой системы со следующим кодом:
«Необработанное исключение в 0x771a15de в xyz.exe: 0xC0000005: расположение чтения нарушения доступа 0xcccccd04.»
и атрибут объекта «адрес» внезапно получает значение «0x0000ffff», в то время как при использовании оператора назначения копирования по умолчанию он работает отлично.
Вы неправильно используете счет. 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
Других решений пока нет …