我正在创建自动清理内存的自定义类。该类包含一个指向SDL_Surface对象的指针,并在需要时调用它的refcount。问题是,当我执行自定义副本分配新建分配FY运营商的系统与下面的代码崩溃:自定义副本赋值操作程序崩溃程序(C++)
“未处理的xyz.exe在0x771a15de例外:0000005:访问冲突读取位置0xcccccd04”
和对象属性“地址”突然获得值“0x0000ffff”,而使用默认的复制赋值运算符它运行得很好。
我正在创建自动清理内存的自定义类。该类包含一个指向SDL_Surface对象的指针,并在需要时调用它的refcount。问题是,当我执行自定义副本分配新建分配FY运营商的系统与下面的代码崩溃:自定义副本赋值操作程序崩溃程序(C++)
“未处理的xyz.exe在0x771a15de例外:0000005:访问冲突读取位置0xcccccd04”
和对象属性“地址”突然获得值“0x0000ffff”,而使用默认的复制赋值运算符它运行得很好。
您正在使用不正确的refcount。 SDL_FreeSurface
将减少refcount,并在空指针上调用时,是无操作。所以,你的赋值运算符应该是这样的:
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
谢谢你本杰明,我应该注意到了!它现在就像一个魅力! – Mix
我强烈建议你使用'的std :: shared_ptr'而不是做参考手动计数。 – jrok
查看[copy-and-swap idiom](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)获取正确行为的简单方法。 jrok是正确的:具有自定义删除器的'shared_ptr'可以更好地解决这个问题。 – GManNickG
'SDL_FreeSurface'会减少refcount,并在空指针上调用时是无操作的。因此,不需要(在析构函数或赋值运算符中)检查NULL,减少refcount或将refcount与0进行比较。只需调用“SDL_FreeSurface”即可。看到这个页面倒数第二个例子:http://sdl.beuc.net/sdl.wiki/SDL_Surface –