#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
已经释放?那为什么内容没有变化?
#3
释放只是作了标记而已,以后其它代码段可以*使用这块内存,所以其内容随时会被改变。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。
#4
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
#5
你借用同桌原来放在桌上的橡皮,后来还了并放回原处。
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
#6
访问已经释放的内存,这么做是没有意义的,你要测试是不是已经释放,做个循环,再在系统中查看进程所占内存的大小有没有变化,没有变化说明已经释放,否则有内存泄露~~~~~~~
#7
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
只是尚未被别人占用而已!如果释放是用某个特定的数字覆盖整个区域,cpu 岂不要累死?
#8
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
难道你认为释放后,还要把那段内存毁尸灭迹吗?
#9
nt是做了合并,linux没有这个过程,所以不变
#10
内存释放过以后并不一定会马上清理的。
另外linux平台和windows平台的内存管理也有差异。没有可比性。
不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。
另外linux平台和windows平台的内存管理也有差异。没有可比性。
不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。
#1
访问已经释放的内存,行为未定义,不必研究了
#2
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
#3
释放只是作了标记而已,以后其它代码段可以*使用这块内存,所以其内容随时会被改变。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。
当前内容没有变化,只是恰好还没有代码段改写这块内存而已,野指针是相当危险的。
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
#4
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
#5
你借用同桌原来放在桌上的橡皮,后来还了并放回原处。
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
现在请你闭上眼睛猜一猜,橡皮现在在哪里?
A.还在原处未动 B.被别的同学借走了还没还 C.被别的同学借走擦脏后还回原位 D.消失于无形
#6
访问已经释放的内存,这么做是没有意义的,你要测试是不是已经释放,做个循环,再在系统中查看进程所占内存的大小有没有变化,没有变化说明已经释放,否则有内存泄露~~~~~~~
#7
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
只是尚未被别人占用而已!如果释放是用某个特定的数字覆盖整个区域,cpu 岂不要累死?
#8
访问已经释放的内存,行为未定义,不必研究了
已经释放?那为什么内容没有变化?
难道你认为释放后,还要把那段内存毁尸灭迹吗?
#9
nt是做了合并,linux没有这个过程,所以不变
#10
内存释放过以后并不一定会马上清理的。
另外linux平台和windows平台的内存管理也有差异。没有可比性。
不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。
另外linux平台和windows平台的内存管理也有差异。没有可比性。
不过这也告诉楼主,C语言malloc的内存块里面的内容都是随机的。
所以,应该调用memset()初始化一下内存块。