回 帖 发 新 帖 刷新版面

主题:[讨论]求助:free()能释放内存吗?


char *a=0;
a=(char *)malloc(100);
gets(a);  \*输入"1234567890"*\
printf("%s\n",a);
free(a);
printf("%s\n",a);
free(a+5);
printf("%s\n",a);
a="abcd";

free(a)释放了内存,用borlandc3.1编译成功,运行还是原样输入,为什么啊?看帖子说free(a+5);会是系统崩溃,可运行没有产生错误,free(a+5)是释放7字节之后的90多个内存字节吗?a="abcd"是a指向了"abcd",能这么赋值吗?"abcd"的值是不是字符串的地址?这样malloc(100)的内存是不是没有指针指向,成了找不到的垃圾了?

回复列表 (共10个回复)

沙发

在哪里malloc的传回一个指针,后来就在哪里free那个指针。
不要试图让指针前进或者后退几个位置再free,即使不崩溃也仅仅是暂时的。或者说这样做存在潜在的崩溃危险。

板凳


就a="abcd"来说,这是合法的,此时a即为指向该串的首地址、、
printf("%s",a);输出就是就是abcd,而printf("%c",*a);就是字符'a'了……

3 楼

1.确实释放了,释放内存并不会附加把数据清0的功能
2.free(a+5) 非常危险。。。。不一定会报错,但是可能会有危险。
而且不是你想的释放7字节后的90多个字节,而且释放某一块不确定字节数,不确定首地址的内存空间
malloc声明是在不同的系统中会在一些你看不到的地方偷偷地方(一般是你声明得到地址的前12或者20字节)写了你空间的首地址,空间大小之类的信息,以便free的时候可以正确释放
3.确实指向了另一个内存区域(代码区)的"abcd"常字符串,这是给a指针赋值,正如你想的"abcd"就是它自己的首地址,并且,malloc(100)确实没有指针指向,造成内存泄露了!~

4 楼

[quote]
就a="abcd"来说,这是合法的,此时a即为指向该串的首地址、、
printf("%s",a);输出就是就是abcd,而printf("%c",*a);就是字符'a'了……
[/quote]
那是不是说常量"abcd"的值是地址?a=地址值,赋值?

5 楼

[quote][quote]
就a="abcd"来说,这是合法的,此时a即为指向该串的首地址、、
printf("%s",a);输出就是就是abcd,而printf("%c",*a);就是字符'a'了……
[/quote]
那是不是说常量"abcd"的值是地址?a=地址值,赋值?[/quote]

没错,是这样的!~

6 楼

[quote]1.确实释放了,释放内存并不会附加把数据清0的功能
2.free(a+5) 非常危险。。。。不一定会报错,但是可能会有危险。
而且不是你想的释放7字节后的90多个字节,而且释放某一块不确定字节数,不确定首地址的内存空间
malloc声明是在不同的系统中会在一些你看不到的地方偷偷地方(一般是你声明得到地址的前12或者20字节)写了你空间的首地址,空间大小之类的信息,以便free的时候可以正确释放
3.确实指向了另一个内存区域(代码区)的"abcd"常字符串,这是给a指针赋值,正如你想的"abcd"就是它自己的首地址,并且,malloc(100)确实没有指针指向,造成内存泄露了!~[/quote]
第1点,释放不清0是不是原有内容还有,但系统可以使用这块内存来存放数据,可以覆盖原有数据?如果不free是不是这块内存就锁定了,只能被这个程序操作,不能被系统修改数据啊?
如果没有free语句,那malloc的内存退出程序后自己会释放吗?还是仍锁定,系统不能修改数据?

7 楼

[quote]第1点,释放不清0是不是原有内容还有,但系统可以使用这块内存来存放数据,可以覆盖原有数据?如果不free是不是这块内存就锁定了,只能被这个程序操作,不能被系统修改数据啊?
如果没有free语句,那malloc的内存退出程序后自己会释放吗?还是仍锁定,系统不能修改数据?[/quote]
1.没错,如果下一次申请内存恰好申请到这一块空间,数据就覆盖了~!
2.我们所用的内存地址是虚拟内存地址,具体这个地址编号和物理内存编号没有任何关系,只有操作系统知道,而我们不知道也无权知道!~但是确实不能被系统修改。。
3.进程结束之时,进程所占的一切资源,包括代码资源,CPU资源,内存资源就统统都没了~~嘿嘿!~~~

8 楼

[quote]
2.我们所用的内存地址是虚拟内存地址,具体这个地址编号和物理内存编号没有任何关系,只有操作系统知道,而我们不知道也无权知道!~但是确实不能被系统修改。。
3.进程结束之时,进程所占的一切资源,包括代码资源,CPU资源,内存资源就统统都没了~~嘿嘿!~~~
[/quote]
第2.是不是能解释上面的回复,malloc内存的地址开始的前15或20个字节存储malloc内存的首地址和其他信息,15或20个字节以后存储我们的数据,而char *a=(char *)malloc(100)后,*a为我们数据的第一个字节的内容,而不是前15或20个字节的信息内容?是不是虚拟内存地址的原因?a指向了我们的数据,但实际malloc(100)首地址应为15或20字节之前的我们申请内存的地址?我们申请的100字节里包括这15或20个字节吗?
第3.进程结束malloc的内存就释放了,那可以不写free语句吗?malloc很多个内存空间,不用了不释放,是不是剩下的内存空间才是系统可用的?这样进程结束之前释放了没用的内存空间会增大内存,如果malloc很少内存,直到进程结束malloc内存都有用,能不写free语句吗?考虑代码越少生成的软件越小,运行占用内存越少,对吗?

9 楼

[quote]
……
malloc声明是在不同的系统中会在一些你看不到的地方偷偷地方([u]一般是你声明得到地址的前12或者20字节[/u])写了你空间的首地址,空间大小之类的信息,以便free的时候可以正确释放~[/quote]
横线的句子我理解错了好像,char *a=(char *)malloc(100),是a之前的15或者20字节?与malloc的100字节没关系是吗?

10 楼



This is only a [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]wow items[/url] description of the normal mob [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]buy wow items[/url] targetting. Obviously there are mobs who [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]buy wow item[/url] will attack secondary targets with special abilities, ignoring their current threat / aggro. 
3) Threat modifiers from Warrior Stances 
In Battle Stance [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]wow gear[/url] and Berserker Stance, all threat from a Warrior is multiplied by 80%. In defensive stance, the [url=http://www.mmopowerlevel.net]buy world of warcraft items[/url] multiplier is 130%. With Defiance, it is 145%. 
Proof: a simple modification of the [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]buy wow gear[/url] above proof. Get a warrior to do, say, 1000 damage in defensive stance, without defiance. Get [url=http://www.mmopowerlevel.net]buy wow item[/url] a non-warrior to take aggro with white damage. You will find it does not happen [url=http://www.mmopowerlevel.net]wow gear[/url] before 1430 damage. The warrior's 1000 damage [url=http://www.mmopowerlevel.net]buy wow gear[/url] caused 1300 threat in defensive stance, and the 10% barrier [url=http://www.mmopowerlevel.net]World of Warcraft Items[/url] means you need more than 1430 to gain aggro. 

我来回复

您尚未登录,请登录后再回复。点此登录或注册