C++奔溃异常-创新互联
0x0000xxx处有未经处理的异常: 0xC0000XXX: 堆已损坏
本文名称:C++奔溃异常-创新互联
新闻来源:http://pwwzsj.com/article/ddjges.html
- C++异常
- 相关简化代码
- 问题分析
- 解决方法
今天用VS开发调试时,遇到崩溃异常,VS弹窗提示:0x0000xxx处有未经处理的异常: 0xC0000XXX: 堆已损坏。调查发现是指针管理问题,现记录如下:
相关简化代码出问题代码
.
// 定义了一个结构体
// 为了兼容多个工程,使用纯C接口,对外公开
struct ATTR_T
{char* strPath;
ATTR_T()
{strPath = nullptr;
}
~ATTR_T
{if(strPath)
{ delete strPath;
strPath = nullptr;
}
}
}
// 定义一个复合结构体
// 工程内部使用,不对外公开
struct PRIVATE_ATTR_T
{std::string strPath;
// 问题出在这里
PRIVATE_ATTR_T(ATTR_T stTemp)
{strPath = stTemp.strPath == NULL ? "" : stTemp.strPath;
}
}
// 主程序
ATTR_T a;
a.strTemp = new char[10];
PRIVATE_ATTR_T pa;
pa = a;
...
问题分析PRIVATE_ATTR_T pa构造函数参数使用值传递方式传入ATTR_T参数(比如ATTR_T a),等于PRIVATE_ATTR_T初始化的时候内部会重新生成一个ATTR_T变量(ATTR_T b),ATTR_T的默认拷贝构造函数是浅拷贝,表示ATTR_T b的内部成员strTemp和ATTR_T a的内部成员strTemp指向的是同一个地址,在PRIVATE_ATTR_T pa构造函数结束时,会自动调用ATTR_T b的析构函数,再主程序结束的时候,也会自动调用ATTR_T a的析构函数,等于有一个地址存在重复释放的情况,这时候程序就奔溃了。
解决方法针对本工程直接做法,构造函数使用引用传参,PRIVATE_ATTR_T(const ATTR_T& stTemp),保险做法是ATTR_T的拷贝构造函数重写,用深拷贝实现。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:C++奔溃异常-创新互联
新闻来源:http://pwwzsj.com/article/ddjges.html