内存........谁都知道我给分的信誉是最好的。
用malloc分配的内存用释放吗?
如果用,如何去做?
如果不用,为什么?
问题点数:60、回复次数:38Top
1 楼Rechard_G(步行者)回复于 2000-12-28 19:32:00 得分 1
VC运行库参考手册说用free释放Top
2 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:33:00 得分 0
to Rechard_G:
你试过吗?好象不行哦。Top
3 楼Virtual(hactech.51.net)回复于 2000-12-28 19:35:00 得分 1
freeTop
4 楼xiner(叉叉)回复于 2000-12-28 19:36:00 得分 1
当然要了.用free()
如下;
char* i=malloc(12);
....
free(i);Top
5 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:39:00 得分 0
to xiner:
你的语句char* i=malloc(12);是错误的。
to Virtual:
似乎不行啊,贴个例程出来好吗?Top
6 楼acute(毛头)(食堂帅哥)回复于 2000-12-28 19:42:00 得分 0
to xiner:
要知道malloc返回的是void *类型,而i是char * 啊!
然后调用free,在运行时会报错。Top
7 楼jadedrip(翡翠水滴)回复于 2000-12-28 20:01:00 得分 1
用 new , delete 不好吗?现在谁还用malloc。(为什么我的脸上黏忽忽的?呀!臭鸡蛋……)Top
8 楼prefix(MtSC)回复于 2000-12-28 20:25:00 得分 2
char *i=(char *)malloc(12);
free(i);
应该这样吧。Top
9 楼acute(毛头)(食堂帅哥)回复于 2000-12-29 00:32:00 得分 0
to prefix:
你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。
Top
10 楼sxbyl(sxbyl)回复于 2000-12-29 08:33:00 得分 2
Faint!!
MSDN上不是有例子吗?
/* MALLOC.C: This program allocates memory with
* malloc, then frees the memory with free.
*/
#include <stdlib.h> /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>
void main( void )
{
char *string;
/* Allocate space for a path name */
string = malloc( _MAX_PATH );
if( string == NULL )
printf( "Insufficient memory available\n" );
else
{
printf( "Memory space allocated for path name\n" );
free( string );
printf( "Memory freed\n" );
}
}
Top
11 楼mmmyyyaaa(编程浪子)回复于 2000-12-30 22:42:00 得分 2
malloc和free配对使用
new和delete配对使用
这是M$的规定,好象具体的操作有些差异Top
12 楼horris(僧推月下门)回复于 2000-12-31 00:27:00 得分 2
to sxbyl:
M$的例子经常有错,应该有free配对使用,但对此例,如没有free,也不会造成内存遗漏,因为当进程停止时,它所申请的所有内存被自动释放。其它情况可就糟糕了。Top
13 楼No9(华龙)回复于 2000-12-31 12:16:00 得分 1
当然是使用free()了,我想你不成功的原因可能是你没有保存malloc()所分配的指针地址,或者在其它地方改变了它的值(我就遇到这种问题),仅作参考!
Top
14 楼gameboy999(-'_'-)回复于 2000-12-31 12:25:00 得分 2
to horris:
真的会自动恢复吗??
如果WinX系列有这么聪明,那memory leaking是怎么出现的??
有malloc就有free,
有new就必有delete!
这是应付一切系统的好方法。反正错不了。Top
15 楼gameboy999(-'_'-)回复于 2000-12-31 12:33:00 得分 1
char *i=(char *)malloc(12);
free(i);
应该这样吧。
回复人:acute(2000-12-29 0:32:00) 得0分
to prefix:
你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。
/*
好象系统为了使内存分配更有合理性,要求每次分配必须是某个值的整数倍
所以这样写就行了
#define chunk_size 8 //假定为必须为8的整数倍,事实上确实winx确实要求为8
char *i=(char *)malloc(chunk_size*_MAXNUM);
free(i);
//ok,不会出错了!*/
上面仅为猜想,如有更好解释,请记得告诉我。
Top
16 楼yoci(阿呸)回复于 2000-12-31 13:44:00 得分 1
char *i = (char *)malloc(12*sizeof(char));Top
17 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 08:51:00 得分 0
to every:
人太多了,加点分。元旦没上来,耽误了。
to gameboy999
8自然可以,我试了一下,好象>=5的都可以。但是我的malloc(4)怎么就不行呢?
to yoci
和上面一样,为什么malloc(4*sizeof(char))就不行呢?Top
18 楼wuchuncai(1234567)回复于 2001-01-02 10:18:00 得分 1
//我一直这样用
char *string;
string=new char[NUMBER];
.....
delete []string;Top
19 楼yoci(阿呸)回复于 2001-01-02 11:34:00 得分 2
假如说4不行而>=5都可以的话,很可能是在使用时越界了。Top
20 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 15:08:00 得分 0
是这样的,我要存4个ASCII字符。用了malloc(4)不行。
而当我想存2个ASCII时,用了malloc(2),free()没问题。Top
21 楼acute(毛头)(食堂帅哥)回复于 2001-01-02 15:21:00 得分 0
错了错了,现在已经是2001/1/2了,所以上面应该是1个ascii字符用了malloc(2)没问题。
刚才试了一下,好象如果存n个字符,需要malloc(n+1),这是为什么呢?
感谢各位朋友的帮助,现在已经接近给分的边缘了,只需继续说明以上问题即可。
Top
22 楼adrianx(蓝色心情)回复于 2001-01-02 15:24:00 得分 0
回复人:acute(2001-1-2 15:08:00) 得0分
是这样的,我要存4个ASCII字符。用了malloc(4)不行。
而当我想存2个ASCII时,用了malloc(2),free()没问题。
你出了什么问题?Top
23 楼killjapan05(ff)回复于 2001-01-02 16:52:00 得分 12
看:
http://www.csdn.net/expert/topicview.asp?id=45164Top
24 楼hooligan(风)回复于 2001-01-02 17:39:00 得分 1
Adrianx:如果您的机器没问题,您就有问题,或者Microsoft有问题?
Top
25 楼Sam_Yang(Sam)回复于 2001-01-02 18:46:00 得分 1
当然是使用free()了Top
26 楼newx(Royale with Cheese)回复于 2001-01-02 19:17:00 得分 10
哎呀,poor guy(girl).
malloc/new 分配内存时在32bit OS上是以4byte对齐的。你分2byte (malloc(2))实际上是分了4bytes,而你再用(malloc(4)),实际上也是分了4bytes.
事实上你两种情况都越界了,但malloc(2)是没出问题,但malloc(4)就出问题了。
我奇怪一定有人不明白为什么free()不需要传入内存尺寸呢?即,
int* pi = malloc(2);
int* pj = malloc(32);
为什么不是这样调用free呢:
free(pi, 2);
free(pj, 32);
那是因为,OS在分配内存时如malloc(2)时一方面是把传入的尺寸以4取整,同时还把的申请的尺寸纪录在了返回内存块的后面某个偏移的地方,再在前后都加上一定格式的头尾,作为“无人区”,当有其他程序改写或读到这些地方是就会引起AV(access violation).
所以当内存越界时(比如往实际分配的4bytes中写入5bytes),数据会覆盖内存块尾部的tag,导致系统试图去释放一块错误尺寸的内存块,内存子系统就会引起AV。
Top
27 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:01:00 得分 1
老哥:在MSDN中free()根本就没有第二个参数,你这样free(pi,2)能编译吗?Top
28 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:04:00 得分 1
to acute:我要存2个字符用malloc(2)可以呀!,我用如下代码:
char *p=(char*)malloc(2);
strcpy(p,"kk");没有问题呀!
Top
29 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:05:00 得分 1
不过怪了:我一用free(p)就出现错误!,我也搞不懂!,请大虾指点一下。Top
30 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:20:00 得分 1
我用以下却可以:
char *p=(char*)malloc(2);//对了,如果此时用int k=strlen(p)返回6,而不是2
free(p);
Top
31 楼vcmfc(【痛苦的虫虫】)回复于 2001-01-02 20:32:00 得分 1
真是见鬼了,我用以下代码也出错:
char *p=new char[2];
strcpy(p,"kk");
delete p;或delete[] p;
我只要在内存分配后一但使用再用free()或delete就出错,怪也!
Top
32 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:10:00 得分 0
刚才拜读了killjapan05介绍的http://www.csdn.net/expert/topicview.asp?id=45164 ,十分感谢。
同时也拜读了newx的回答,也有收获。
但我对他们所说的4bytes的内存分配方式有点疑惑。如果内存是以4取整,我调用malloc(2)时应该实际分配4bytes大小的内存。例如我存"kk",会存入四位字符'k','k','\0',''。也就是说并没有越界,调用free应该没错的啊。在这里再次请教newx.
但如果说在字符串后一定要有一个'\0'做结尾标志倒可以理解,这样,每长度为n的字符串,做内存分配的时候需n+1的分配长度。
Top
33 楼wuchuncai(1234567)回复于 2001-01-03 09:15:00 得分 10
我看了前面的一些问题。
其实"kk"占3个BYTE,"kkkk"占5个BYTE,字符串最后有一个结束符。
strcpy(p,"kk");其实已过界,window有一定的容错能力,free就出错,运气好,free可能还不会出错,但这样用,你的程序不会稳定的。
strlen(p),分配内存后,p中是一些乱码,其值会是一些随机值。
Top
34 楼wuchuncai(1234567)回复于 2001-01-03 09:18:00 得分 1
该给分了Top
35 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:18:00 得分 0
问题初步解决,只期待newx的补充,然后就开始给分了!Top
36 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 09:33:00 得分 0
算了,开始给分!Top
37 楼eyeblue(李洋)回复于 2001-01-03 10:06:00 得分 0
其实问题在于你对内存的使用上,当你用strcpy(p,"kk");时,实际上p="kk/0",共三个字节
而你的p只申请了两个字节,这样你事实上破坏了p所指向的内存块,你free时C识别错误,当然要错了!
解决办法就是申请内存时大一点(1就行了),我一般在这种情况下就用字符数组char[128]
不需要malloc和free,只有在你需要多份不固定大小的内存时,才有必要用malloc和freeTop
38 楼acute(毛头)(食堂帅哥)回复于 2001-01-03 11:09:00 得分 0
我说老大,我都给完分了,你才来答,这不是亏了吗?Top




