ringa_lee2017-04-18 10:53:17
ポインターが指すスペースnew
出来的对象, 必须进行手动delete
. 析构函数不会帮你自动析构, 比如std::string* s = new std::string;
. 如果这是在一个类里面构造的string, 这个类会将s
回收, 但是不会将s
がリサイクルされる場合、参照が実際にはエイリアスであることを覚えておくだけで済み、独自の判断が可能です。
阿神2017-04-18 10:53:17
あまり話すべきではなかったし、よく理解できませんでした。
関数の最後では、関数本体で宣言された自動変数と関数の仮パラメータのみが破棄され(破棄され)、それらが参照するオブジェクト(存在する場合)は破棄によって破棄されません。ポインタ/参照によって参照されるオブジェクトには、独自の独立した保存期間があり、このオブジェクトがいつ破棄されるかは、そのオブジェクト自体の保存期間に依存します。
あなたの質問で尋ねたのは、デストラクターが暗黙的に呼び出されるときです。デストラクターの暗黙的な呼び出しは、オブジェクトの保存期間にも依存します。簡単に言うと、オブジェクトが構築されると、そのオブジェクトが破棄されるときにそのデストラクターが呼び出されます。
12.3.2.11 デストラクターは暗黙的に呼び出されます
— 静的ストレージ期間 (3.7.1) を持つ構築オブジェクトの場合はプログラム終了時 (3.6.3)、
— スレッドストレージ期間 (3.7.2) を持つ構築オブジェクトの場合はスレッド終了時に、
— オブジェクトが作成されたブロックが終了するときの自動ストレージ期間 (3.7.3) を持つ構築されたオブジェクトの場合 (6.7)、
— 一時オブジェクトの有効期間が終了したときに構築された一時オブジェクトの場合 (12.2)、
— 構築されたオブジェクトの場合オブジェクトは、new-expression (5.3.4) によって、delete-expression (5.3.5) を使用して割り当てられます
— 例外の処理 (15.3) により、いくつかの状況で発生します。
引用について:
参照はオブジェクトではありませんが、保存期間もあります(保存期間はどの変数にも適用されます)。保存期間の破棄ルールは参照にも適用されます。
しかし、参照が破棄されたときに何が起こるかについての正確な説明は見つかりませんでした。参照が正確にどのように破棄されるかは、コンパイラの実装によって異なります。一般的な状況は次のようになります。実装中に参照が記憶域スペースを占有する場合、そのスペースは再利用されます。所有がなければ何も起こりません。 (関数がインライン化されていない場合、参照型の仮パラメーターはストレージ領域を占有することがよくあります)
3.7.3 保存期間のカテゴリは参照にも適用されます。
参照の有効期間はその保存期間です。8.3.2.4 参照がストレージを必要とするかどうかは未指定です。
3.9.8 オブジェクト型は、関数型、参照型、void 型ではない (おそらく cv 修飾された) 型です。
1.8 [...] オブジェクトはストレージの領域です [注: 関数は、オブジェクトと同様にストレージを占有するかどうかに関係なく、オブジェクトではありません。] [...]
怪我咯2017-04-18 10:53:17
1. デストラクターは、クラス変数のライフサイクルが終了した後、スペースがリサイクルされる前に呼び出される関数です。
2. クラス ポインターとクラス参照 (変数を指す定数ポインター) は基本的なデータ型 (ポインター) のみであり、関数呼び出しの完了後に、対応するスタック領域はリサイクルされません。
3. 最初の点で述べたように、渡されたパラメーターがクラス オブジェクトの場合、スペースがリサイクルされる前にデストラクターが呼び出されます。
4. スタック上のすべてのクラス変数はライフサイクル終了後に自動的に破棄されますが、ヒープ上のクラス変数 (new などの操作によって割り当てられたもの) は破棄されず、デストラクターの呼び出しをトリガーするために手動で解放する必要があります。