我在函数中定义了一个对象:
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;
}
答案 0 :(得分:8)
是的,该对象在函数的作用域中定义,因此当函数的作用域结束时,它超出了作用域。你需要:
按值返回,或
动态分配,即使用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
}
答案 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;
其中p
是SoundFXSystem*
,其值与system
中设置的Engine::GetSystem()
相同。这并不简单,因为似乎可能会抛出异常。最好使用智能指针(例如unique_ptr
或shared_ptr
):
std::shared_ptr<SoundFXSystem> Engine::GetSystem(){
auto system = std::make_shared<SoundFXSystem>(); // var defined inside a function
// ...
return system;
}