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
コールバックの正しい使い方は何ですか?