You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中数据成员销毁期间this指针是否有效?代码场景问询

问题分析与解答

销毁流程回顾

执行delete p销毁Proxy对象时,实际执行顺序为:

  1. 调用Proxy的析构函数(本例中为空函数,无实际操作)。
  2. 按成员声明的逆序销毁Proxy的非静态数据成员:
    • 先销毁proxyImplementation_:shared_ptr的析构会触发ProxyImplementation对象的析构函数~ProxyImplementation。
    • 再销毁number_:int类型无需额外析构逻辑,直接回收存储空间。
  3. 最终释放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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:43:27