C++中数据成员销毁期间this指针是否有效?代码场景问询
问题分析与解答
销毁流程回顾
执行delete p销毁Proxy对象时,实际执行顺序为:
- 调用
Proxy的析构函数(本例中为空函数,无实际操作)。 - 按成员声明的逆序销毁
Proxy的非静态数据成员:- 先销毁
proxyImplementation_:shared_ptr的析构会触发ProxyImplementation对象的析构函数~ProxyImplementation。 - 再销毁
number_:int类型无需额外析构逻辑,直接回收存储空间。
- 先销毁
- 最终释放
Proxy对象本身占用的内存。
核心问题解答
1. ~ProxyImplementation中访问proxy_指针是否合法?
proxy_指针本身是有效的——它指向的Proxy对象内存尚未被释放(要等所有成员销毁完成后才会释放)。但必须明确:此时Proxy对象的生命周期已经结束(从其析构函数开始执行时就已终止),因此不能将proxy_指向的内容当作一个完整的、有效的Proxy对象使用。
- 合法操作:单纯持有指针、检查指针地址。
- 非法操作:调用
Proxy的成员函数、访问虚函数等依赖对象“有效身份”的行为(均属于未定义行为)。
2. ~ProxyImplementation中访问proxy_->number_是否有效?
这属于未定义行为。
尽管number_的生命周期尚未结束(要等proxyImplementation_销毁后才会被销毁),但proxy_指向的Proxy对象已经终止生命周期。根据C++标准,通过指向已终止生命周期对象的指针访问其成员,无论成员是否还存在,都属于未定义行为——编译器可能正常读取值,也可能产生不可预料的结果。
如果需要安全访问该值,建议在ProxyImplementation中存储number_的副本,或在Proxy析构时主动通知ProxyImplementation停止访问原对象。
内容的提问来源于stack exchange,提问作者pmoubed
相关产品推荐
相关产品推荐

