4

C++ でのメモリ処理についていくつか質問があります。

  1. Mystruct *s = new Mystructとの違いは何Mystruct sですか? メモリ内で何が起こるか?

  2. このコードを見ると:

    struct MyStruct{
        int i;
        float f;
    };
    
    MyStruct *create(){
        MyStruct tmp;
        tmp.i = 1337;
        tmp.j = .5f;
        return &tmp;
    }
    
    int main(){
        MyStruct *s = create();
        cout << s->i;
    
        return 0;
    }
    

解放されるのはMyStruct tmpいつ?MyStruct tmpが最後に自動的に解放されないのはなぜcreate()ですか?

ありがとうございました!

4

9 に答える 9

1

どちらの質問も、保存期間と範囲を扱っています。

まず、オブジェクトを動的に割り当てる場合、オブジェクトとそのオブジェクトへのポインタは、解放するまで有効です。自動変数の場合(つまり、、などによって動的に割り当てられてnewおらmallocず、宣言されていない場合static)、オブジェクトのスコープが終了するとすぐに変数はスコープ外になります(通常、これは、のスコープ}と同じ「レベル」にあります)。オブジェクトが定義された)。また、「自動ストレージ期間」もあります。これは、オブジェクトがスコープ内にない場合、そのストレージもなくなることを意味します。

2番目の質問についてtmpは、で終わるスコープが}ありcreateます。また、同じ保存期間があります。へのポインタtmpは、その保存期間内でのみ有効です。終了するとcreate()、へのポインタtmpは無効になり、使用できなくなります。

于 2010-02-04T08:36:18.080 に答える
0
struct MyStruct{ int i; };

MyStruct create(){ MyStruct tmp; tmp.i = 1337; return tmp; }

int main(){

  MyStruct s = create();
  cout << s.i;

  return 0;
}

また

struct MyStruct{ int i; };

MyStruct* create(){ MyStruct* tmp = new MyStruct; tmp->i = 1337; return tmp; }

int main(){

  MyStruct* s = create();
  cout << s->i;
  delete s;    

  return 0;
}

動作します。最初のケースで s に割り当てられたときに、コピー コンストラクターが構造体のコピーを作成するためです。すべての新規/削除 (動的メモリ割り当て) は、C++ の基本に属します。基本的なアルゴリズムを実装するために new または delete を使用する必要はありません。コピーコンストラクターなどは常に仕事をし、コードを理解しやすくします。

new を使用したい場合は、autopointer などについても読む必要があります。C++ にはメモリのガベージ コレクションはありません。Thinking C++は、動的メモリの概念を非常によく説明していると思います(第 13 章)。

于 2010-02-04T08:23:06.983 に答える