3

関数内にオブジェクトを定義しました。

SoundFXSystem* Engine::GetSystem(){
   SoundFXSystem system; // var defined inside a function
   sEngine->GetSystem(&system);
   return &system; // can I return the address of the var?
}

var のアドレスを返し、後でプログラムで使用することは合法ですか? 関数が終了するとすぐに範囲外になり、呼び出し元が使用できなくなりますか?

編集:オブジェクトを次のように定義すると、動的に割り当てられますか?

SoundFXSystem* Engine::GetSystem(){
   SoundFXSystem* system = new SoundFXSystem(); // var defined inside a function
   sEngine->GetSystem(&system);
   return system; 
}
4

3 に答える 3

8

はい、オブジェクトは関数のスコープで定義されているため、関数のスコープが終了するとスコープ外になります。次のいずれかを行う必要があります。

  1. 代わりに値で返す、または

  2. newまたはを使用して、動的に割り当てます。std::make_shared

を使用して割り当てる場合は、後でnew誰かがそれを知っていることを確認してください。deleteそのため、関数の割り当てからの生のポインターの代わりに戻ることが推奨されstd::unique_ptrます。これにより、メモリリークの可能性が回避されます。

代わりに値で返すには、関数を次のように変更します。

SoundFXSystem Engine::GetSystem(){
   SoundFXSystem system; // var defined inside a function
   sEngine->GetSystem(&system);
   return system;  //return var by value
}
于 2013-03-23T12:30:25.443 に答える
3

2 番目の質問について: はい、ヒープに動的に割り当てられ、delete完了したら d する必要があります。

その間のばかげた質問: このコードの目的は何ですか? ポインターへの参照を渡しています...メモリリークが必要でない限り、変更しないでください。&オブジェクトへのポインターではなく、オブジェクトを変更するために、ポインターのみを渡したい場合があります。

「値による返品」について:

SoundFXSystem Engine::GetSystem(){
   SoundFXSystem system;           //Declares the local object
   sEngine->GetSystem(&system);    //Passes the pointer to the object
   return system;                  //Returns a 'Value Copy' of the object.
}
于 2013-03-23T12:33:49.953 に答える
2

これは機能しますが、危険です。

SoundFXSystem* Engine::GetSystem(){
    SoundFXSystem* system = new SoundFXSystem(); // var defined inside a function
    // ...
    return system; 
}

生のポインタ(SoundFXSystem*)を使用している場合、コンパイラはオブジェクトを自動的に破棄しません。あなたは電話することによってそれを自分でしなければなりません

delete p;

ここpで、はで設定したSoundFXSystem*値と同じ値です。例外がスローされる可能性があるため、これは簡単ではありません。スマートポインタ(または)を使用することをお勧めします。systemEngine::GetSystem()unique_ptrshared_ptr

std::shared_ptr<SoundFXSystem> Engine::GetSystem(){
    auto system = std::make_shared<SoundFXSystem>(); // var defined inside a function
    // ...
    return system; 
}
于 2013-03-23T12:43:51.267 に答える