“HEAP CORRUPTION DETECTED” 错误原因和解决办法

一、问题描述

代码中使用智能指针share_ptr,创建一个指向类对象的智能指针。在该智能指针自动释放的时候提示如下错误:

二、产生的原因

      我们申请特定大小的内存,因为在使用过程中导致内存溢出,所以最终在释放该内存的时候就会提示HEAP CORRUPTION DETECTED。

简单的例子可以复现该问题:

char* p = new char[5];
strcpy(p, "aaaaa");
delete []p;

如下图可以看出在执行strcpy的过程中已经造成内存溢出。因此释放的时候会报错。

以上的描述是导致这个问题的根本原因,即实际使用的内存超过指针所申请的内存

但是我遇见的问题没有这么直观。我的问题是因为实际项目中习惯于把头文件集中的symbolLink到一个inc路径下,以便于其他工程引用。当我们在Check Out状态下修改.h文件时,inc路径下的.h文件不会被修改,只有Check In之后才会同步。这样在Check Out状态下进行调试时,会导致同一个.h文件出现差异。如果inc路径下.h文件中定义的类成员小于实际的类成员个数,如下所示:

inc 路径下:

//inc 路径下的A.h
class A
{
public:
	A();
	~A();
private:
	int a;
};

工程路径下:

//工程路径下的A.h
class A
{
public:
	A();
	~A();
private:
	int a;
	int b;
};


//工程路径下的A.cpp
#include "A.h" //引用工程路径下的A.h
A::A()
{
	a = 0;
	b = 0;
}
A::~A()
{
}

其他工程引用inc路径下的A.h文件

#include "A.h" //inc 路径下的

int main()
{
	std::share_ptr<A> p;  //申请时候的内存空间,不包括成员变量b的空间
        p = std::make_shared<A>(); //调用构造函数时,使用的内存空间多出一个成员变量b的空间
	return 0;
}

以上情况在share_ptr释放内存空间时,就会报错。该问题是因为引用的头文件不一致,使用时内存溢出,最终导致HEAP CORRUPTION DETECTED。

参考链接:https://blog.csdn.net/weixin_41220759/article/details/90341731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值