使用std::shared_ptr与std::dynamic_pointer_cast时析构异常问题排查
你遇到的问题是:使用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
相关产品推荐
相关产品推荐

