パスワードを忘れた? アカウント作成
12680488 journal
日記

m_nukazawaの日記: GTK3さわってる近況(GdkPixbuf開放) 1

日記 by m_nukazawa

あらためて、C言語プログラミングではきちんとNULLチェックしよう、という話でした。

前後関係を書いてみたところまとめるのが大変だったので、大まかに省略した箇条書きで。

・作成中のGTKアプリケーションで、GdkPixbufを画面バッファに使っている。
・古いGdkPixbufを削除する際に下記のWARNINGが出て、アプリが正常に描画されなくなる。

たしか「g_object_unref: assertion 'G_IS_OBJECT (object)' failed」だったと思う。
GdkPixbufがg_objectでないとはどういうことだ、何か変なポインタでもキャストして突っ込んでしまったかな、と悩んだのですが、以下のとおりに解決。

・g_object_unref() に渡すpixbufポインタのNULLチェックを追加して解決。
・どうやらg_object_unref() はNULLチェックをしていないらしい。
・上記エラーが出ている状態では、画面に画像が描画されなかったのだが、C言語の未定義動作を踏んで描画命令が削除されたいたものと思われる。

g_object_unref() は上位層にGTKやGDKがあり、呼び出しが多くなる可能性もあるため速度に拘ってNULLチェックを省いているのかもしれない。
なお gdk_pixbuf_unref() は非推奨になった模様。g_object_unref() があるからいらないよね、ということかと。
GTK3は、GTK2でラップして使っていたglibやcairoを露出して、ラップ部分のコードを削減する方針に進んでいるように見える。

次回(があれば)、cairoとGdkPixbufの連携について日記を書くかも。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 通常、参照カウンタを減らすとか何かを開放するっぽい関数を作る場合、値を返さず、NULLを入れると単に返るだけにする。
    ナントナク、既に参照カウンタを0にして解放済みのモノを突っ込んだ場合の挙動に見える。

typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...