[解決済み]コピーコンストラクターと代入演算子を実装するのを忘れました。デフォルトのコピーを使用するように割り当てられているインスタンスは、それが指すサーフェスを作成したインスタンスと同じポインタを取得します。それらの1つが破棄するか、redraw()を呼び出すと、もう1つは解放されたメモリへのポインタを保持し、セグメンテーション違反を引き起こします。
アプリケーションにテキストラベルのクラスがあります。プロパティが変更されると、自動的にプライベートサーフェスに再描画されます。
一般的に、再描画は次のようになります。
void Text::redraw() {
if(_font==0) return;
if(_image) {
SDL_FreeSurface(_image); //this line throwing a segfault
_image = 0;
}
_image = TTF_RenderUTF8_Blended(_font, _text.c_str(), _color);
}
しかし、サーフェスを解放するとコードがクラッシュします(もちろん、解放するサーフェスがない場合、ポインタは0に等しいため、有効なものだけです)。
また、一部のマシンでコードが正常に機能し、メモリが解放されるのも不思議です。しかし、他のものではそれはクラッシュします。
サーフェスを解放する行をコメントアウトすると、アプリケーションは正常に機能しますが、メモリリークが発生します。私はその解決策も見つけも説明もしませんでした。
コンストラクターで_imageを0に設定します。redraw()関数(およびデストラクタ)を除いて、_ imageの値を変更したり、サーフェスを解放したりするコードはありません。
どういうわけか、XPでのみクラッシュするメモリを解放します。解放部分をコメントアウトしてもクラッシュしません。どちらのバリアントもwin7(x86とx64の両方)でうまく機能します。