内存........谁都知道我给分的信誉是最好的。 VC运行库参考手册说用free释放 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to Rechard_G:你试过吗?好象不行哦。 当然要了.用free()如下;char* i=malloc(12);....free(i); to xiner:你的语句char* i=malloc(12);是错误的。to Virtual:似乎不行啊,贴个例程出来好吗? to xiner:要知道malloc返回的是void *类型,而i是char * 啊!然后调用free,在运行时会报错。 用 new , delete 不好吗?现在谁还用malloc。(为什么我的脸上黏忽忽的?呀!臭鸡蛋……) char *i=(char *)malloc(12);free(i);应该这样吧。 to prefix:你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。 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" ); }} malloc和free配对使用new和delete配对使用这是M$的规定,好象具体的操作有些差异 to sxbyl:M$的例子经常有错,应该有free配对使用,但对此例,如没有free,也不会造成内存遗漏,因为当进程停止时,它所申请的所有内存被自动释放。其它情况可就糟糕了。 当然是使用free()了,我想你不成功的原因可能是你没有保存malloc()所分配的指针地址,或者在其它地方改变了它的值(我就遇到这种问题),仅作参考! to horris:真的会自动恢复吗??如果WinX系列有这么聪明,那memory leaking是怎么出现的??有malloc就有free,有new就必有delete!这是应付一切系统的好方法。反正错不了。 char *i=(char *)malloc(12);free(i);应该这样吧。 回复人:acute(2000-12-29 0:32:00) 得0分 to prefix:你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。/*好象系统为了使内存分配更有合理性,要求每次分配必须是某个值的整数倍所以这样写就行了#define chunk_size 8 //假定为必须为8的整数倍,事实上确实winx确实要求为8char *i=(char *)malloc(chunk_size*_MAXNUM);free(i);//ok,不会出错了!*/上面仅为猜想,如有更好解释,请记得告诉我。 char *i = (char *)malloc(12*sizeof(char)); to every:人太多了,加点分。元旦没上来,耽误了。to gameboy9998自然可以,我试了一下,好象>=5的都可以。但是我的malloc(4)怎么就不行呢?to yoci和上面一样,为什么malloc(4*sizeof(char))就不行呢? //我一直这样用char *string;string=new char[NUMBER];.....delete []string; 是这样的,我要存4个ASCII字符。用了malloc(4)不行。而当我想存2个ASCII时,用了malloc(2),free()没问题。 错了错了,现在已经是2001/1/2了,所以上面应该是1个ascii字符用了malloc(2)没问题。刚才试了一下,好象如果存n个字符,需要malloc(n+1),这是为什么呢?感谢各位朋友的帮助,现在已经接近给分的边缘了,只需继续说明以上问题即可。 回复人:acute(2001-1-2 15:08:00) 得0分 是这样的,我要存4个ASCII字符。用了malloc(4)不行。而当我想存2个ASCII时,用了malloc(2),free()没问题。 你出了什么问题? 看:http://www.csdn.net/expert/topicview.asp?id=45164 Adrianx:如果您的机器没问题,您就有问题,或者Microsoft有问题? 哎呀,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。 老哥:在MSDN中free()根本就没有第二个参数,你这样free(pi,2)能编译吗? to acute:我要存2个字符用malloc(2)可以呀!,我用如下代码:char *p=(char*)malloc(2);strcpy(p,"kk");没有问题呀! 不过怪了:我一用free(p)就出现错误!,我也搞不懂!,请大虾指点一下。 我用以下却可以:char *p=(char*)malloc(2);//对了,如果此时用int k=strlen(p)返回6,而不是2free(p); 真是见鬼了,我用以下代码也出错:char *p=new char[2];strcpy(p,"kk");delete p;或delete[] p;我只要在内存分配后一但使用再用free()或delete就出错,怪也! 刚才拜读了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的分配长度。 我看了前面的一些问题。其实"kk"占3个BYTE,"kkkk"占5个BYTE,字符串最后有一个结束符。strcpy(p,"kk");其实已过界,window有一定的容错能力,free就出错,运气好,free可能还不会出错,但这样用,你的程序不会稳定的。strlen(p),分配内存后,p中是一些乱码,其值会是一些随机值。 问题初步解决,只期待newx的补充,然后就开始给分了! 其实问题在于你对内存的使用上,当你用strcpy(p,"kk");时,实际上p="kk/0",共三个字节而你的p只申请了两个字节,这样你事实上破坏了p所指向的内存块,你free时C识别错误,当然要错了!解决办法就是申请内存时大一点(1就行了),我一般在这种情况下就用字符数组char[128]不需要malloc和free,只有在你需要多份不固定大小的内存时,才有必要用malloc和free 菜单项拖动时的问题 MFC中右键菜单定制按钮的问题.. 初学MFC 麻烦给点建议。 刚申请的账号 分数问题很尴尬。 还是矩形热点拖动缩放问题 请问如何列出某个进程的所有线程和顶级窗口 再问个类型转换的问题 如何从CString转到HKEY啊?(刚才答我题的devzhao、B1ue再来拿分) 如何实现exe加一个参数运行 高薪诚聘C/C++高级程序开发 有关时间的问题,非常急!!!!!!!!!(只能给这么多分了) 呵呵,问一个关于CRecordset的问题。 关于IDataObject的问题 请Python来提款!
你试过吗?好象不行哦。
如下;
char* i=malloc(12);
....
free(i);
你的语句char* i=malloc(12);是错误的。to Virtual:
似乎不行啊,贴个例程出来好吗?
要知道malloc返回的是void *类型,而i是char * 啊!然后调用free,在运行时会报错。
free(i);
应该这样吧。
你没有运行吧。这个样子编译和连接时都没错,可一运行就有错了。
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" );
}
}
new和delete配对使用这是M$的规定,好象具体的操作有些差异
M$的例子经常有错,应该有free配对使用,但对此例,如没有free,也不会造成内存遗漏,因为当进程停止时,它所申请的所有内存被自动释放。其它情况可就糟糕了。
真的会自动恢复吗??
如果WinX系列有这么聪明,那memory leaking是怎么出现的??有malloc就有free,
有new就必有delete!
这是应付一切系统的好方法。反正错不了。
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,不会出错了!*/
上面仅为猜想,如有更好解释,请记得告诉我。
人太多了,加点分。元旦没上来,耽误了。
to gameboy999
8自然可以,我试了一下,好象>=5的都可以。但是我的malloc(4)怎么就不行呢?
to yoci
和上面一样,为什么malloc(4*sizeof(char))就不行呢?
char *string;
string=new char[NUMBER];
.....
delete []string;
而当我想存2个ASCII时,用了malloc(2),free()没问题。
刚才试了一下,好象如果存n个字符,需要malloc(n+1),这是为什么呢?感谢各位朋友的帮助,现在已经接近给分的边缘了,只需继续说明以上问题即可。
是这样的,我要存4个ASCII字符。用了malloc(4)不行。
而当我想存2个ASCII时,用了malloc(2),free()没问题。
你出了什么问题?
http://www.csdn.net/expert/topicview.asp?id=45164
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。
char *p=(char*)malloc(2);
strcpy(p,"kk");没有问题呀!
char *p=(char*)malloc(2);//对了,如果此时用int k=strlen(p)返回6,而不是2
free(p);
char *p=new char[2];
strcpy(p,"kk");
delete p;或delete[] p;
我只要在内存分配后一但使用再用free()或delete就出错,怪也!
同时也拜读了newx的回答,也有收获。
但我对他们所说的4bytes的内存分配方式有点疑惑。如果内存是以4取整,我调用malloc(2)时应该实际分配4bytes大小的内存。例如我存"kk",会存入四位字符'k','k','\0',''。也就是说并没有越界,调用free应该没错的啊。在这里再次请教newx.
但如果说在字符串后一定要有一个'\0'做结尾标志倒可以理解,这样,每长度为n的字符串,做内存分配的时候需n+1的分配长度。
其实"kk"占3个BYTE,"kkkk"占5个BYTE,字符串最后有一个结束符。
strcpy(p,"kk");其实已过界,window有一定的容错能力,free就出错,运气好,free可能还不会出错,但这样用,你的程序不会稳定的。
strlen(p),分配内存后,p中是一些乱码,其值会是一些随机值。
而你的p只申请了两个字节,这样你事实上破坏了p所指向的内存块,你free时C识别错误,当然要错了!
解决办法就是申请内存时大一点(1就行了),我一般在这种情况下就用字符数组char[128]
不需要malloc和free,只有在你需要多份不固定大小的内存时,才有必要用malloc和free