linux64与win32释放结构体时表现不一样,求解

时间:2021-08-04 10:30:21
对于结构体,先释放第一个指针成员,再释放结构体指针,这时候在linux64下,第二个数组成员或指针成员的内容没变,而在win32下发生变化。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct st_a
{
struct st_a *p;
char str[256];
}st_a;

int main()
{
st_a *pA = NULL;

pA = (st_a *)malloc(sizeof(st_a));
memset(pA, 0, sizeof(st_a));
pA->p = (st_a *)malloc(sizeof(st_a));
memset(pA->p, 0, sizeof(st_a));
strcpy(pA->str, "oh, i love you");

printf("shi fang qian :pA->str = %s\n", pA->str);

free(pA->p);
free(pA);
printf("shi fang hou :pA->str = %s\n", pA->str);
return 0;
}

win32下的结果:
shi fang qian :pA->str = oh, i love you
shi fang hou :pA->str = ?


linux64下结果:
shi fang qian :pA->str = oh, i love you
shi fang hou :pA->str = oh, i love you


另外,我发现只有第一个成员为结构体型的指针,才会出现这种情况。请问,linux64下第二个成员到底释放没有?

10 个解决方案

#1


访问已经释放的内存,行为未定义,不必研究了

#2


引用 1 楼 mujiok2003 的回复:
访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?

#3


释放只是作了标记而已,以后其它代码段可以*使用这块内存,所以其内容随时会被改变。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。

引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?

#4


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?
释放只是归还内存而已,没有要求修改其内容。

#5


你借用同桌原来放在桌上的橡皮,后来还了并放回原处。
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
linux64与win32释放结构体时表现不一样,求解

#6


访问已经释放的内存,这么做是没有意义的,你要测试是不是已经释放,做个循环,再在系统中查看进程所占内存的大小有没有变化,没有变化说明已经释放,否则有内存泄露~~~~~~~

#7


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?


只是尚未被别人占用而已!如果释放是用某个特定的数字覆盖整个区域,cpu 岂不要累死?

#8


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?


难道你认为释放后,还要把那段内存毁尸灭迹吗? linux64与win32释放结构体时表现不一样,求解

#9


nt是做了合并,linux没有这个过程,所以不变

#10


内存释放过以后并不一定会马上清理的。
另外linux平台和windows平台的内存管理也有差异。没有可比性。

不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。

#1


访问已经释放的内存,行为未定义,不必研究了

#2


引用 1 楼 mujiok2003 的回复:
访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?

#3


释放只是作了标记而已,以后其它代码段可以*使用这块内存,所以其内容随时会被改变。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。

引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?

#4


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?
释放只是归还内存而已,没有要求修改其内容。

#5


你借用同桌原来放在桌上的橡皮,后来还了并放回原处。
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
linux64与win32释放结构体时表现不一样,求解

#6


访问已经释放的内存,这么做是没有意义的,你要测试是不是已经释放,做个循环,再在系统中查看进程所占内存的大小有没有变化,没有变化说明已经释放,否则有内存泄露~~~~~~~

#7


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?


只是尚未被别人占用而已!如果释放是用某个特定的数字覆盖整个区域,cpu 岂不要累死?

#8


引用 2 楼 lming_08 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

访问已经释放的内存,行为未定义,不必研究了

已经释放?那为什么内容没有变化?


难道你认为释放后,还要把那段内存毁尸灭迹吗? linux64与win32释放结构体时表现不一样,求解

#9


nt是做了合并,linux没有这个过程,所以不变

#10


内存释放过以后并不一定会马上清理的。
另外linux平台和windows平台的内存管理也有差异。没有可比性。

不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。