-2

参照スコープが終了したときにポインタのオブジェクト (ヒープ内のオブジェクト) を参照するとどうなりますか? つまり、ヒープ内のオブジェクトが破棄されているか、残っているかです。

例えば:

void f(){
    Object &obj= *new Object() ;

   int &i = new int;
}

void main(){
  f();
}

オブジェクトは f の最後で破棄されますか、それとも最後に「delete &n」を呼び出す必要がありますか? プリミティブ値についても同じですか?破棄する必要がある場合、定数プリミティブ値のコピーを作成し、「新規」で作成せずに参照に割り当てるにはどうすればよいですか?

(文法や正書法、および元の質問からの入力エラーについては申し訳ありません)

4

3 に答える 3

1
Object &n = new Object();

これはコンパイルされません。new 式likeは、動的に割り当てられたオブジェクトへのnew Object()ポインタを返します。Object&を で初期化することはできませんObject*

type の参照がある場合は、T&type のオブジェクトで初期化する必要がありますT。それがリファレンスの仕組みです。オブジェクトT&への参照です。T

あなたはこれを行うことができます:

Object &n = *new Object();

これは、 new-expression ( with *)によって返されたポインターを逆参照して、Objectそれが指している を取得し、その で参照を初期化しますObject。ただし、これを行うことはまったくお勧めしません。オブジェクトが動的に割り当てられたという事実を隠すだけです。

いいえ、これを行っても、動的に割り当てられたオブジェクトの有効期間には影響しません。new-expressionを使用してオブジェクトを作成すると、動的な保存期間があるためdelete、ある時点でそれを行う必要があります。

于 2013-04-02T09:25:05.840 に答える
0

まず、決める必要があります。あなたはこれを求めている:

Object &n = * new Object();

または、これが必要です:

Object* &n = new Object();

とにかく、参照がスコープ外に出ても、オブジェクトが削除されることはありません。あなたの例では、メモリリークが発生し、ヒープに割り当てられたObjectとを回復する方法がありません。int

于 2013-04-02T09:24:51.780 に答える