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

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

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

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

并且对象属性“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

关于c++ - 自定义复制赋值运算符使程序崩溃(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223161/

相关文章:

c++ - 为什么我的 switch/case 在使用枚举时默认?

audio - 使用SDL Mixer的比赛持续时间

c++ - 我应该为真实世界的游戏引擎使用什么 3D 图形框架?

c - 为什么 SDL 使 3 个事件提前发生?

c++ - 我们能否从运行时给定的参数中检测到要动态调用的函数?

c++ - 结构冗余

c++ - 如果 f 修改 x,x*f(x) 的值是否未指定?

javascript - jQuery 计算来自服务器的 img 的真实高度/宽度值

php - 调整图像大小而不实际更改文件夹中的图像

php - 使用 jquery/php/html 更改 img src 和 fileupload 值