C++奔溃异常

0x0000xxx处有未经处理的异常: 0xC0000XXX: 堆已损坏

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的拷贝构造函数重写,用深拷贝实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值