5

書き込もうとしているいくつかのイベントハンドラークラスに問題があります。基本的には、オブジェクトの論理グループごとにイベントハンドラークラスを用意するという考え方です。ほとんどの場合、イベントはオブジェクトとそのハンドラーの間で発生しますが、場合によっては、イベントがハンドラーオブジェクト間でも送信されます。

イベントがスタックに配置されるようにコードを記述しました(ユーザーが作成した構造のようにスタックします。イベント自体はを使用して割り当てられますnewdelete。dは、情報が読み取られて処理された後です。あるケースでは、イベントが3つのハンドラーのチェーンに沿って送信されるため、これは私にいくつかの問題を与えています。たとえば、にHandlerAを送信しますnew EventHandlerBこれは、スタックに配置して読み取り、に送信します。に送信するとHandlerC、読み取りと実行に必要な処理が実行され、その後delete、イベントポインタがに設定されNULLます。今、私たちは戻ってHandlerB、まあ、それはまたしたいと思っていdeleteますNULLイベントへのポインタ。ただし、ポインタはローカル変数であり、同じアドレスを2回削除することになり、例外が発生します。

これをどのように回避しますか?あなたはそれらの派手なものの1つを使う必要がありますかauto_ptr(まだここでは初期の学習者です)、それとも私はここで基本的な何かを逃していますか?

4

3 に答える 3

10

イベントがスタックに配置され、情報が読み取られて処理された後に削除されるようにコードを記述しました。

ここにはいくつかの混乱があります-スタック上のオブジェクトはdであってはなりません。(ヒープ上で)delete作成されたオブジェクトはすべきです。new

一般に、ヒープ上のオブジェクトの明確な所有権戦略を定義する必要があります。各オブジェクトには1人の所有者が必要であり、いつでも所有者が誰であるかを明確にする必要があります。その所有者-そしてそれだけで-deleteオブジェクトをしなければならない。

生のポインタの代わりに使用することもできます(コンパイラによっては、boost::shared_ptrとしても使用できる場合があります)。std::tr1::shared_ptrこれにより、オブジェクトへの参照のカウントが保持されdelete、参照カウントが0に低下したときにカウントされます。

于 2010-07-14T11:16:54.497 に答える
6

必要なのは、インスタンスに対して参照カウントを使用して、他の変数が同じインスタンスを参照しているかどうかを確認するポインターラッパーです。ポインタが指すオブジェクトは、そのオブジェクトが他のポインタによって使用されていない場合にのみ割り当てが解除されるという考え方です。これらの種類のポインターは、一般にスマートポインターと呼ばれます。C ++では、たとえばBoostが提供するものを使用できます。

于 2010-07-14T11:18:10.477 に答える
1

私が見ている問題は、ポインタの明確な所有者がいないことです。1つの解決策は、inflagrantiの回答で指摘されているスマートポインターです。または、イベントの転送を2回停止することもできます。ハンドラー(この例ではハンドラーB)が別のハンドラーに転送する必要のあるイベントを受信すると、既存のイベントへのポインターを渡すのではなく、新しいイベントを作成します。

そうは言った。あなたがそれらを調べることに時間を費やすつもりなら、私はスマートポインタソリューションがおそらくより良いと思います!

于 2010-07-14T11:30:01.723 に答える