目前查到的资料,发现只有在结构体带指针,在拷贝结构体时(要用memcpy)时会出现。有些地方用结构体赋值代替memcpy结构体,结果是一样的,但是,个人认为,赋值不叫拷贝,应该就叫赋值,否则浅拷贝情况太多了。
下面这篇讲memcpy的部分应该是正解:
memset()函数与memcpy()函数知识总结---结构体中有指针变量_memcpy内存泄漏-CSDN博客
这里结构体里面的指针是指向了动态分配内存。其实就算是指向任何一个变量或者数组,拷贝结构体时都是浅拷贝,即,拷贝结构体的指针本身(值)被拷贝,也就是其指向被拷贝结构体指针指向的值,而不指向原来指向的值,原来指向的值就和这个指针脱离了。
所以这在释放内存时会出问题,会导致原来拷贝结构体指针指向的动态内存没有指针指向它,也基本就无法释放了,后面如果涉及动态内存申请和释放,程序会报错。而如果再按照常规流程,依次释放这两个结构体指向动态内存的指针,则导致同一块内存被释放两次,也会报错。
struct stTest
{
int a;
int *p;
};
int main()
{
stTest stTT1, stTT2;
stTT1.a = 1;
int x[10] = { 0 };
stTT1.p = x;
memcpy(&stTT2, &stTT1, sizeof(stTT1)); // 拷贝结构体
return 0;
}
在依次将断点打在