コンストラクターとその破壊されたインスタンスのトレースに取り組んでおり、そのためにコンストラクターとデストラクターで「this」の値をログに記録することを計画しています。コンストラクターで「this」の値をログに記録しても安全かどうかはわかりません。安全でない場合、失敗するシナリオを知りたくありませんか?
3 に答える
「ロギング」とは、「値をログ ファイルに 16 進数のアドレスなどとして書き出す」ことを意味する場合、問題なく安全です。そうでない場合は、明確にしてください。
コンストラクターの呼び出しが完了するまで、オブジェクトは完全には構築されません。したがって、その前に (つまり、コンストラクター内から)this
プログラムの残りの部分に発行することは安全ではありません。その結果、誰かが半分構築されたオブジェクトを実際に使用しようとする可能性があるためです。これにより、微妙で見つけにくいバグが発生する可能性があります。
公開this
とは、次のいずれかを意味する場合があります。
- それをパラメーターとして外部 (非メンバー) 関数に渡します。
- 他のオブジェクトが利用できるデータ構造に格納する
- (完全を期すために: 関数呼び出しから返す - コンストラクターから何も返すことができないため、この特定のケースには適用されません)。
したがって、ファイルへのアドレスをthis
書き出すことは、それをプログラムの残りの部分に公開しない*ので、問題ないはずです。
*まあ、後で非常に難解なことをしない限り、別のスレッド/プロセスでファイルからアドレスをロードし直してオブジェクトポインターにキャストし直すなど...それ自体はすでに十分に安全ではありません:-)
なぜ安全ではないと思うのですか?オブジェクトが有効である限り、実際にオブジェクトのアドレスをログに記録するのと同じです。
要するに、使用しようとしているシナリオで安全であるということです。
最初にメモリが割り当てられ、次にthis
設定され、次にコンストラクタが呼び出されます。したがってthis
、正しい場所を指すため、コンストラクター中に使用しても問題ありません-構造は変更されませんthis
。ただし、構築が失敗した (スローされた) 場合、メモリは失われ、 が指す値はthis
ガベージになるため、構築が成功することがわかるまで、それを格納してコンストラクタの外部で使用しないでください。