在c++函数中定义的对象在超出作用域后会被销毁吗?

visual Will an object defined inside a C++ function be destroyed after it goes out of scope?

本文关键字:作用域 函数 c++ 定义 对象      更新时间:2023-10-16

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

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

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

Edit:如果我这样定义对象,它会被动态分配吗?

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

是的,对象是在函数的作用域中定义的,所以当函数的作用域结束时,它就超出了作用域。您需要:

  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
}

关于第二个问题:是的,它将在堆上动态分配,一旦完成它需要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.
}

这是可行的,但是很危险:

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

你正在使用一个原始指针(SoundFXSystem*),然后,编译器不会自动销毁对象。你必须自己调用

delete p;

其中pSoundFXSystem*,与Engine::GetSystem()中设置的system值相同。这看起来并不简单,因为可能会抛出异常。最好使用智能指针(例如unique_ptrshared_ptr):

std::shared_ptr<SoundFXSystem> Engine::GetSystem(){
    auto system = std::make_shared<SoundFXSystem>(); // var defined inside a function
    // ...
    return system; 
}