質問

Evaluator クラスのオーバーロードされたクラスコンストラクターを通過する QScriptEngine へのポインターがあり、それを QScriptEngine * engine _ (クラス Property Evaluator をサブクラス化し、 Evaluator のこのコンストラクターを呼び出して、既に割り当てられた QScriptEngine を渡します)。引数なしのコンストラクターは、新しい QScriptEngine ポインターを作成します(この方法でクラス Generic サブクラス Evaluator )。デストラクタで、 engine _ NULL でないかどうかをテストし、ポインターを削除して、 NULL を割り当てます。派生 Property のポインター( engine _ )も NULL になりますか?何かがそうではないことを教えてくれます。そうでない場合、この状況にどのように対処しますか? QScriptEngine が全体を通して同じインスタンスである必要があります。 QScriptEngine の=演算子はprivateであるか、ポインターを一緒に回避することになります。

別のSO質問で、共有ポインター( boost :: shared_ptr および std:tr1 :: shared_ptr )に関する情報を見ました。私はすでに正規表現ライブラリにブーストを使用しているので、ブーストがこれに対処する最良の方法であるかどうかは疑いの余地はありません。一般的なC ++の知識と将来のプロジェクトのために、ブースト以外の方法があることを願っています。

役に立ちましたか?

解決

これを解決するには、クラスの1つ(クラスA)にそのポインターのライフタイムコントロールと「getter」メソッドを与えます。他のクラス(クラスB)は、ポインターが必要なときは常にAのゲッターを呼び出します。このようにして、Aは常にポインターを制御し続けます。欠点はゲッター関数です(おそらくインラインになりますが、2番目のインダイレクションのままです)。また、Bはほとんどすべての使用でNULLのポインターをチェックする必要があります。

他の選択肢は、boost :: shared_ptrのようなものでポインターをラップすることです。これは、基になるポインターを保持し、そのポインターを共有するすべてのオブジェクトが削除されたときにのみ削除することで問題を処理します(適切に使用される場合)。これを自分で書くこともできますが、すでにブーストを持っているので、実装を使用するだけです。

3番目の選択肢は、共有ポインタを必要としないように、全体をリファクタリングすることです。個人的に、共有ポインターを必要とするC ++プログラムを設計したことはありません。メモリ管理のバグが長年にわたって簡単に忍び込む可能性があるからです。しかし、それは私だけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top