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

时间:2013-03-23 12:29:04

标签: c++ visual-c++ pointers syntax garbage-collection

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

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; 
}

3 个答案:

答案 0 :(得分:8)

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

  1. 按值返回,或

  2. 动态分配,即使用newstd::make_shared

  3. 如果您使用new进行分配,请确保稍后有人知道delete。这就是为什么首选返回std::unique_ptr而不是分配函数的原始指针 - 它可以避免可能的内存泄漏。

    要按值返回,您可以按如下方式更改函数:

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

答案 1 :(得分:3)

关于第二个问题:是的,它将在堆上动态分配,一旦你完成它就需要delete

中间有一个愚蠢的问题:这段代码的目的是什么?您将引用传递给指针...请确保不要更改它,除非您想要内存泄漏。您可能只想传递指针(不带&)来更改对象,而不是指向对象的指针。

关于'按价值回归':

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.
}

答案 2 :(得分:2)

这有效,但这很危险:

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

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

来自己完成
delete p;

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

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