13

私はこれを理解していません:

3.8 / 1 "タイプTのオブジェクトの存続期間は、次の場合に終了します。— Tが重要なデストラクタ(12.4)を持つクラスタイプの場合、デストラクタ呼び出しが開始するか、または—オブジェクトが占有するストレージが再利用または解放されます。 「」

デストラクタが開始する前にライフタイムが終了する場合、それはデストラクタのメンバーへのアクセスが未定義の動作であることを意味しませんか?

私もこの引用を見ました:

12.7「重要なデストラクタを持つオブジェクトの場合、デストラクタの実行が終了した後にオブジェクトの非静的メンバーまたは基本クラスを参照すると、未定義の動作が発生します。」

しかし、デストラクタ中に何が許可されるかは明確ではありません。

4

4 に答える 4

9

デストラクタが開始する前にライフタイムが終了する場合、それはデストラクタのメンバーへのアクセスが未定義の動作であることを意味しませんか?

うまくいけば:

N3242から建設と破壊[class.cdtor] /3

オブジェクトobjの直接の非静的メンバーへのポインタを形成する(またはその値にアクセスする)には、objの構築が開始され、その破棄が完了していない必要があります。そうでない場合、ポインタ値の計算(またはメンバーへのアクセス)が行われます。 value)は未定義の動作になります。

于 2011-12-23T01:54:20.353 に答える
7

オブジェクトの「存続期間」は、オブジェクト自体ではなく、オブジェクトのコンシューマーに関連します。したがって、消費クラスは、破棄が開始された後、オブジェクトのメンバーにアクセスしようとしないでください。

于 2011-12-23T01:54:55.563 に答える
5

いいえ、問題ありません。

メンバーオブジェクトは、コンストラクター本体が実行される前に有効になり、デストラクタが終了するまで有効になります。したがって、コンストラクタとデストラクタでメンバーオブジェクトを参照できます。

オブジェクト自体は、それ自体のコンストラクターが終了するまで存続せず、デストラクタが実行を開始するとすぐに停止します。しかし、それは外の世界に関する限りです。コンストラクタとデストラクタは、引き続きメンバーオブジェクトを参照できます。

于 2011-12-23T01:56:05.453 に答える
2

「生涯」はそれを意味するものではありません。これは、さまざまな意味を持つ規格で正確に定義された用語ですが、あなたが考えるすべての意味を持っているとは限りません。メンバーは、構築中および破棄中に引き続き使用でき、外部コードはメンバー関数などを呼び出すことができます。

確かに、クライアントコードがデストラクタと同時にメンバー関数を呼び出すのは少し奇妙ですが、前代未聞ではなく、言語によって許可されていないことは確かです。特に、std::condition_variableへの未処理の呼び出しがあるときにデストラクタを明示的に呼び出すことができますcondition_variable::wait()。デストラクタの起動後にのみ、への新しい呼び出しを禁止します。wait()

于 2017-01-12T18:45:56.160 に答える