我正在创建一个用于自动清理内存的自定义类。该类包含一个指向 SDL_Surface 对象的指针,并在需要时调用它的 refcount。问题是当我实现自定义复制分配运算符时,系统崩溃并出现以下代码:
“xyz.exe 中 0x771a15de 处未处理的异常:0xC0000005:访问冲突读取位置 0xcccccd04。”
并且对象属性“address”突然获得值“0x0000ffff”,同时使用默认的复制赋值运算符它运行得很好。
我正在创建一个用于自动清理内存的自定义类。该类包含一个指向 SDL_Surface 对象的指针,并在需要时调用它的 refcount。问题是当我实现自定义复制分配运算符时,系统崩溃并出现以下代码:
“xyz.exe 中 0x771a15de 处未处理的异常:0xC0000005:访问冲突读取位置 0xcccccd04。”
并且对象属性“address”突然获得值“0x0000ffff”,同时使用默认的复制赋值运算符它运行得很好。
您错误地使用了引用计数。 SDL_FreeSurface
将减少引用计数,并且当在空指针上调用时,是一个空操作。因此,您的赋值运算符应如下所示:
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