在C++函数内部定义的对象在超出范围后是否会被销毁?

Rob*_*cks 3 c++ syntax garbage-collection pointers visual-c++

我在函数中定义了一个对象:

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

返回var的地址并在以后的程序中使用它是否合法?当函数退出并且调用者无法使用时,它是否会立即超出范围?

编辑:如果我按如下方式定义对象,它会被动态分配吗?

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

Rei*_*ica 8

是的,该对象在函数的作用域中定义,因此当函数的作用域结束时,它超出了作用域.你需要:

  1. 通过值返回它,或者

  2. 动态分配,即使用newstd::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
}
Run Code Online (Sandbox Code Playgroud)