自定义复制赋值运算符使程序崩溃(C ++)

时间:2013-01-08 20:07:24

标签: c++ image sdl copy-constructor copy-assignment

我正在创建一个自动清理内存的自定义类。该类包含一个指向SDL_Surface对象的指针,并在需要时调用它的refcount。问题是,当我实现自定义复制分配运算符时,系统崩溃时使用以下代码:

“xyz.exe中0x771a15de处的未处理异常:0xC0000005:访问冲突读取位置0xcccccd04。”

并且对象属性“address”突然获得值“0x0000ffff”,而使用默认的复制赋值运算符则运行得非常好。

1 个答案:

答案 0 :(得分:2)

您错误地使用了引用计数。 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