C++执行delete释放对象时报xmemory读访问违例错误如何修复
C++ 删除动态分配内存时报xmemory相关错误的修复方案
问题根因
- 指针
mp[3]被非法赋值,同时产生内存泄漏和野指针:
初始mp[3] = new VTR(...)申请了堆内存,后续执行mp[3] = *mp[1] + mp[2];时直接覆盖了原地址,原堆内存直接泄漏。如果+运算符重载返回的是栈上的临时对象,赋值给指针后,临时对象在当前语句执行结束后就会自动销毁,mp[3]就变成了野指针,后续delete操作访问已销毁的内存就会抛出你遇到的报错,错误码0xDDDDDDE1正是Windows调试环境下标记已释放内存的特征值。 - 基类
Media未定义虚析构函数:多态场景下用基类指针销毁派生类对象时,如果基类没有虚析构函数,只会调用基类的析构函数,派生类的资源无法被正确释放,也会触发内存访问错误。 - 若
=运算符重载没有实现深拷贝:类存在动态分配的成员变量时,默认浅拷贝会导致同一块内存被多次释放,也会触发相关错误。
修复步骤
- 调整
mp[3]的赋值逻辑,先释放原有内存再绑定新的堆对象:// 先释放mp[3]原本申请的内存,避免泄漏 delete mp[3]; // 修改+运算符重载返回堆上的对象指针,或者用返回的临时对象拷贝构造新的堆对象 mp[3] = new LegalDVD(*mp[1] + mp[2]); // 可根据你的+运算符实际返回的派生类类型调整 - 给基类
Media添加虚析构函数,保证多态销毁逻辑正常:class Media { // 原有成员定义 public: virtual ~Media() = default; // 虚析构函数,C++11及以上可用default,低版本手动写空实现即可 }; - 检查
+、=运算符重载的实现,确保涉及动态成员的操作都做了深拷贝,避免浅拷贝带来的重复释放问题。
内容的提问来源于stack exchange,提问作者김민겸
相关产品推荐
相关产品推荐

