関連する手順/問題をリストしています。彼らは私のために働いたが、私は彼らが100%正しいとは保証できない
0) 循環共有ポインタが存在する可能性があるかどうかを確認します。もしそうなら、これはメモリリークにつながる可能性がありますか? 私の場合、幸運なことに、サイクルを壊す必要はありません。なぜなら、サイクルがあれば、サイクル内のオブジェクトは有用であり、破壊されるべきではないからです。ウィーク ポインターを使用してサイクルを中断する
X*
1) 「ほとんど」をに置き換える必要がありますshared_ptr<X>
。shared_ptr は (のみ?) X のすべての動的割り当ての直後に作成されます。それ以外の場合は常に、コピーで構築されるか、空のポインターで構築されます (シグナル NULL へ)。安全のために (ただし、少し非効率的です)、これらの shared_ptrs は参照によってのみ渡します。とにかく、そもそも参照によってポインタを渡したことがない可能性があります => 追加の変更は必要ありません
2)dynamic_cast<X*>(y)
いくつかの場所で使用した可能性があります。それを
dynamic_pointer_cast<X>(y)
3) 渡した場所NULL
(たとえば、計算が失敗したことを通知するため) には、空の共有ポインターを渡します。
4) 関連するタイプのすべての削除ステートメントを削除します
5) 基本クラス B を から継承させenable_shared_from_this<B>
ます。次に、あなたが通過したところはどこでもthis
、通過しshared_from_this()
ます。関数が派生型を想定している場合は、静的キャストが必要になる場合があります。を呼び出すときは、すでに を所有してshared_from_this()
いる必要があることに注意してください。特に、クラスのコンストラクタで呼び出さないでくださいshared_ptr
this
shared_from_this()
このプロセスを半自動化して、意味的に同等のコードを取得できると確信していますが、必ずしも非常に効率的なコードではありません。プログラマーはおそらく、循環参照 (もしあれば) について推論する必要があるだけです。
これらのステップの多くで、正規表現を頻繁に使用しました。3~4時間ほどかかりました。コードはコンパイルされ、これまでのところ正しく実行されています。