一、问题描述
代码中使用智能指针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