base64でエンコードされたJPEG bytearrayから循環画像を作成するために小さなクラスを作成しましたが、常にsegfaultが発生するようです。これはGJSのカイロ表面を作るのに最も簡単な方法でしたが、私の問題を解決すればクラッタに反対しません。私のGdk/cairoクラスがsegfaultを引き起こすのはなぜですか?
var CircularImage = new Lang.Class({
Name: "CircularImage",
Extends: Gtk.DrawingArea,
_init: function (bytearray, win, size) {
this.parent({
height_request: size,
width_request: size
});
this.size = size;
let image_stream = Gio.MemoryInputStream.new_from_data(
GLib.base64_decode(bytearray),
GLib.free
);
let pixbuf = GdkPixbuf.Pixbuf.new_from_stream(
image_stream,
null
)
pixbuf.scale_simple(this.size, this.size, GdkPixbuf.InterpType.HYPER);
this._surface = Gdk.cairo_surface_create_from_pixbuf(
pixbuf,
0,
win.get_window()
);
this.connect("draw", (widget, cr) => {
this._draw(widget, cr);
return false;
});
},
_draw: function (widget, cr) {
cr.setSourceSurface(this._surface, 0, 0);
cr.arc(this.size/2, this.size/2, this.size/2, 0, 2*Math.PI);
cr.clip();
cr.paint();
}
});
ありCairoImageSurfaceのための機能や信号を破壊し、私はそれが助けかどうかを確認するためにPIXBUFをunreffingしようとしたように見えるが、これはエラーになりません。
GLib-GObject-WARNING **: g_object_remove_toggle_ref: couldn't find toggle ref 0x7f45456b19e0((nil))
IシンプルなGtkウィンドウでこれを使用していますが、それは動作しますが、セグメンテーションの失敗の原因は半分程度です。私はたいていガベージコレクション言語を使用しているのでメモリ管理についてはほとんど知っていないので、私はこれが解放していないメモリと何らかの関係があると仮定します。
私は間違ったことをしていますか、クラッターでこれを行う簡単な方法か、任意のsegfaultsを追跡できる簡単な方法はありますか?
ありがとう、私は今これを使用することができてうれしいです。 1つの質問ですが、 'cr.paint()'の後にdrawコールバックで 'cr $ dispose()'を呼び出す必要があると思いますか? –
それは正しいです、それは戻る前に最後のものでなければなりません。 – ptomato
これでもう少しテストしましたが、まだメモリリークが発生しているようです。すべてが確実に解放されるように ':: destroy'を行う特別な呼び出しはありますか? –