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

使用std::shared_ptr与std::dynamic_pointer_cast时析构异常问题排查

std::shared_ptr析构异常问题分析与解决

你遇到的问题是:使用std::dynamic_pointer_cast做类型转换能正常工作,但Class1析构时销毁智能指针触发异常。结合你的代码,问题根源和修正方案如下:

核心错误:所有权重复接管导致重复析构

你直接用接口传入的裸指针raw_ptr_from_interface构造std::shared_ptr<base_class>,这会让该shared_ptr获得指针的所有权。但接口传入的裸指针生命周期大概率由调用方管理(比如调用方会自行释放,或指针已被其他智能指针托管)。当m_shared_ptr_1析构时,会尝试delete该指针,此时调用方可能已经释放过一次,直接触发重复释放的内存异常。

正确处理方式

如果调用方不转移指针所有权,你有两种可选方案:

  • 使用空删除器:让shared_ptr接管指针但析构时不执行delete,避免重复释放:
    std::shared_ptr<base_class> pointer_check(raw_ptr_from_interface, [](base_class*) {});
    m_shared_ptr_1 = std::dynamic_pointer_cast<derived_class_1>(pointer_check);
    
  • 直接用裸指针做类型转换:如果不需要持有指针,仅做类型判断,可以直接用dynamic_cast:
    derived_class_1* derived_ptr = dynamic_cast<derived_class_1*>(raw_ptr_from_interface);
    if (derived_ptr) {
        // 执行逻辑
    }
    

代码中的其他语法问题

  • 私有成员声明错误:std:shared_ptr少了一个冒号,且缺少模板参数,应改为:
    std::shared_ptr<derived_class_1> m_shared_ptr_1;
    
  • main中的Class1 class1();是函数声明,不是对象实例化,应改为:
    Class1 class1;
    

内容的提问来源于stack exchange,提问作者egev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:35:04