0

メモリを自動的にクリーンアップするためのカスタム クラスを作成しています。このクラスには SDL_Surface オブジェクトへのポインタが含まれており、必要に応じてその refcount を呼び出します。問題は、カスタム コピー代入演算子を実装すると、システムが次のコードでクラッシュすることです。

「xyz.exe の 0x771a15de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xcccccd04.」

オブジェクト属性「アドレス」は突然値「0x0000ffff」を取得しますが、デフォルトのコピー割り当て演算子を使用すると、完全に正常に実行されます。

4

1 に答える 1

2

refcount の使い方が間違っています。 SDL_FreeSurfacerefcount をデクリメントし、null ポインターで呼び出された場合はノーオペレーションです。したがって、代入演算子は次のようになります。

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 を null ポインターに初期化する必要があります。

Image::Image() :img(NULL) {}

このページの最後から 2 番目の例を参照してください: http://sdl.beuc.net/sdl.wiki/SDL_Surface

于 2013-01-08T20:34:33.900 に答える