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. 动态分配它,即使用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
}
于 2013-03-23T12:30:25.443 回答
3

关于第二个问题:是的,它将在堆上动态分配,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;

其中pa与 中设置SoundFXSystem*的值相同。这并不简单,因为看起来可能会引发异常。最好使用智能指针(例如or ):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 回答