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

C++ map存unique_ptr时static_cast转换指针触发double free错误求解

问题触发原因
  • 第一重直接原因:对同一块内存执行了两次手动释放
    basePtr 和 static_cast 得到的 derivedPtr 指向完全相同的内存地址,连续执行 delete basePtr 和 delete derivedPtr 相当于对同一地址释放两次,直接触发double free错误。
  • 第二重隐藏错误:手动释放std::unique_ptr管理的内存
    该内存的所有权属于mapOfClasses中存储的std::unique_ptr<Base>,智能指针会在自身析构时自动释放持有的内存。你手动提前释放后,全局mapOfClasses在main函数退出析构时,内部的unique_ptr会尝试再次释放已经无效的内存,属于第三次非法释放。
  • 第三重设计隐患:基类未定义虚析构函数
    当你用基类指针Base*指向派生类Derived对象并通过基类指针执行delete时,因为基类没有虚析构函数,只会调用基类的析构函数,不会执行派生类的析构逻辑。如果派生类持有其他动态分配的资源,会直接导致内存泄漏。

额外说明你提到的static_cast转换后成员变量值随机的问题:你当前的复现代码里转换是合法的(基类指针确实指向派生类对象),所以能正常输出2。如果实际场景中你无法100%保证基类指针指向的就是目标派生类对象,向下转型建议通过让基类至少包含一个虚函数的方式,使用dynamic_cast做安全检查,转换失败会返回空指针,避免访问非法内存导致随机值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:21:03