2017-03-15 8 views
0

gtkSourceViewでコールバック "query-tooltip-text"を使いたいです。gtkSourceView - query-tooltip-textの使用

... 
g_signal_connect(G_OBJECT(attributes), "query-tooltip-text", G_CALLBACK(on_lineMarkerTooltip_displayed), context->plainTextEditor_lineMarkers[lineNumber-1]->message); 

これはうまくいきます。ツールチップを表示する必要があるときはいつでも、私のメソッドが呼び出されます。 ...->messageは、永続的にメモリに格納されているC文字列です。ここに私のコールバックメソッド:

gchar* on_lineMarkerTooltip_displayed(GtkSourceMarkAttributes *attributes, GtkSourceMark *mark, char* message) 
{ 
    printf("message3: %s\n", message); // just to see what is going on 
    return message; 
} 

私は、文字列の寿命を制御して行われたときにそれを解放する必要がありgtk3 source doc統計は、私はそれは問題ないはずだと思います。それが二度目に呼び出された後、私のコールバックはダブルフリーのセグメンテーション違反で失敗しかし

:公式ドキュメントに語ったよりも

... 
message3: bad hour 
message3: 
message3: `�/EV 
*** Error in `./cron-gui': double free or corruption (fasttop): 0x000056452fc70240 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x70bcb)[0x7f85670a9bcb] 
/lib/x86_64-linux-gnu/libc.so.6(+0x76f96)[0x7f85670aff96] 
/lib/x86_64-linux-gnu/libc.so.6(+0x7778e)[0x7f85670b078e] 
/usr/lib/x86_64-linux-gnu/libgtk-3.so.0(+0x214447)[0x7f85694 
... 

ので異なる、gtk3は、使用後に、文字列のメモリを解放するように見えます。私はそのようにそれに応じて私のコールバックを修正しようとしました:うまく機能

gchar* on_lineMarkerTooltip_displayed(GtkSourceMarkAttributes *attributes, GtkSourceMark *mark, char* message) 
{ 
    printf("message3: %s\n", message); // just to see what is going on 
    return strdup(message); 
} 

は、しかし、私は自分のアプリケーションが現在のメモリを食べることができることを恐れています。 query-tooltip-textコールバックの正しい使い方は何ですか?

答えて

0

私はlibgtksourceviewのソースコードを確認しました。ライブラリによって文字列が解放されました。シグナルハンドラのドキュメントは間違っています。

は、私はここで、パッケージのメンテナのためにバグを提出:だから実際にそれを使用することが正しいです https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=857873

... 
return strdup(message); 
... 
関連する問題