在c++函数中定义的对象在超出作用域后会被销毁吗?
visual Will an object defined inside a C++ function be destroyed after it goes out of scope?
我在函数内部定义了一个对象:
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;
}
是的,对象是在函数的作用域中定义的,所以当函数的作用域结束时,它就超出了作用域。您需要:
-
按值返回,或者
-
动态分配,即使用
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
}
关于第二个问题:是的,它将在堆上动态分配,一旦完成它需要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;
其中p
为SoundFXSystem*
,与Engine::GetSystem()
中设置的system
值相同。这看起来并不简单,因为可能会抛出异常。最好使用智能指针(例如unique_ptr
或shared_ptr
):
std::shared_ptr<SoundFXSystem> Engine::GetSystem(){
auto system = std::make_shared<SoundFXSystem>(); // var defined inside a function
// ...
return system;
}
相关文章:
- C++quit()函数中可能存在作用域问题
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 在构造函数中输入对象时C++类成员作用域
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 如何从类函数返回指向类作用域数组的指针?
- 局部变量的作用域是块或函数
- 当变量在多个函数作用域中使用时,我应该在类 private 中声明该变量吗?
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 块作用域中的函数指针定义
- 当作用域中出现条件时,如何重置函数中的变量?
- 函数在作用域中定义,但编译器抱怨它超出了作用域
- 在编译时选择全局作用域函数
- 函数和类的作用域有什么区别
- 空的唯一指针在离开作用域时调用析构函数
- 作用域仅限于函数的类变量
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化