18

参照である属性を持つC++クラスがあるとします。

class ClassB {
    ClassA &ref;
public:
    ClassB(ClassA &_ref);
}

もちろん、コンストラクターは次のように定義されます。

ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }

私の質問は次のとおりです。クラス「ClassB」のインスタンスが破棄されると、「ClassB :: ref」によって参照されるオブジェクトも破棄されますか?

4

7 に答える 7

18

参照は変数のエイリアスにすぎません。エイリアスは破棄され、実際の変数ではありません。あなたはそれをある種の指針と考えることができますが、この種の(邪悪な)考えを控える理由があります:)。

于 2010-05-25T20:33:59.673 に答える
11

いいえ。参照メンバーは、それらが指すものの有効期間には影響しません。これは、エイリアスが参照よりも長いまたは短い寿命を持つ可能性があることを意味します。

一方、const 参照は、一時的なものを指している場合、それらが指すものの寿命に影響を与える可能性があります。

あなたの場合、そうではありません。

于 2010-05-25T20:52:25.497 に答える
2

いいえ。その~ClassBため、ClassB がストレージを担当しrefない可能性がある場合、デストラクタが必要です。

于 2010-05-25T20:31:10.727 に答える
1

C++ でオブジェクトが削除されると、そのメモリの割り当てが解除されるため、オブジェクトに埋め込まれていたもの (メンバー変数など) もすべて失われます。

ポインターの場合、ポインターはアドレスを含むメンバー変数であるため、アドレスは「破棄」されますが、参照されるオブジェクトがあれば、それは破棄されません。

参照メンバーの場合、アドレスは破棄されますが、ターゲットは影響を受けません。

クラスは、特別な動作を定義できるデストラクタを定義できます。このような一般的な動作の 1 つは、メンバー (存在する場合) に対してクリーンアップ操作を呼び出し、以前に動的に割り当てられたメモリの割り当てを解除することです。ただし、ここでは既にオブジェクトを取得しているため、オブジェクトの割り当てを解除する必要はありません。

于 2010-05-25T20:54:54.230 に答える
0

いいえ; 参照は、ポインターの代替構文にすぎません。参照の割り当てが解除された場合、それらが参照する値は変更されません。

于 2010-05-25T20:30:42.073 に答える
0

それを破棄したい場合は、それをカプセル化する必要があります (通常、std::shared_ptr や std::unique_ptr などの「スマート」ポインターを介して行われます)。これにより、B の破棄時に適切な方法でメモリが自動的に解放されます。言語内参照には、参照とは対照的に、参照自体の実際のメモリを除いて、それらに関連付けられたメモリ解放動作はありません。

独自のメモリ モデルを構築して理解する必要があります。人々は通常、基本的な用途に shared_ptr と参照カウントを使用します。

于 2010-05-25T20:43:26.707 に答える
-1

私は手元に C++ 仕様を持っていませんが、私の推測では「いいえ」です。

オブジェクトが破棄されてもポインターは自動的に削除されません。参照が異なる必要がある理由はわかりません。さらに、参照を自動的に破棄すると、興味深いバグが発生する可能性があります。

于 2010-05-25T20:31:36.297 に答える