自定义复制赋值操作符使程序崩溃(c++)

Custom copy assignment operator crashes the program (C++)

本文关键字:c++ 崩溃 程序 复制 赋值操作符 自定义      更新时间:2023-10-16

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

" xyz.exe中0x771a15de的未处理异常:0xC0000005:访问违反读取位置0xcccccd04。"

和对象属性"address"突然获得值"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