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
相关产品推荐
相关产品推荐

