cpp对象生命周期
内容简介
对象生命周期指对象从创建、可用,到销毁的全过程。C++ 的构造函数、析构函数、拷贝、移动、引用、指针都和生命周期有关。
理解生命周期后,悬挂引用、野指针、重复释放、浅拷贝等问题会更容易定位。
常见生命周期
| 对象位置 | 创建时机 | 销毁时机 |
|---|---|---|
| 局部对象 | 执行到定义语句 | 离开作用域 |
| 全局对象 | 程序启动阶段 | 程序结束阶段 |
| 静态局部对象 | 第一次执行到定义处 | 程序结束阶段 |
| 动态对象 | new 或智能指针创建 | delete 或所有者销毁 |
| 临时对象 | 表达式求值时 | 通常到完整表达式结束 |
示例
#include <string>
std::string make_name()
{
std::string name = "Alice";
return name;
}name 是局部对象,但返回它是安全的。现代 C++ 通常会进行 RVO/NRVO,或者使用移动语义。
易错点
const std::string& bad()
{
std::string name = "Alice";
return name; // 错误:返回局部对象引用
}函数结束后 name 已经销毁,返回的引用会悬挂。
注意事项
- 指针和引用不一定拥有对象,它们可能只是观察。
- 对象销毁顺序通常和构造顺序相反。
- 临时对象生命周期延长规则存在,但基础阶段不要依赖复杂规则写代码。