1

パラメータとして使用する関数がいくつかありますがvoid *、この場合にスマートポインタを渡す方法は?

たとえば、私は

gboolean callback(gpointer arg); // might delete arg when it finish

A *mydata = new A();
gpointer parg = (gpointer)mydata;
g_timeout_add(100, callback, parg);

ここでスマート ポインターを使用するとどうなりますか。

std::shared_ptr<A> mydata(new A());

の引数に変換する方法はg_timeout_add(.., void*)?

4

1 に答える 1

4

あなたのタイトルから、gpointer実際にはvoid*. その場合、元の型を破棄すると、 aが合法であることを保証できないため、might delete arg when it finish本当に意味があると言うときも想定します。free()delete

g_timeout_addその場合、コールバックとスマート ポインターの両方が同じメモリを削除する可能性があり、未定義の動作になる可能性があるため、どのような状況でもスマート ポインターを使用して呼び出しに渡さないでください。

の所有者を決定する必要がありますmydata: 呼び出し元、コールバック、または共有。次に、それに基づいて、呼び出し元/コールバック コードを実装して、それらの所有権のセマンティクスを適切に表すことができます。

于 2013-07-30T17:46:39.423 に答える