C语言中free函数的用法
不可以的。
malloc, alloc, free是c定义的一组内存管理的API函数,当你调用malloc、alloc分配内存时,不仅仅是从堆里面分配得到了可用内存,实际上内存管理子系统还会维护了内存列表。你自己定义的指针不会在这个列表中的,所以free会出问题的。
那么,使用new, GlobalAlloc之类的方式分配的内存可不可以使用free呢。我的回答是,尽量不要,大部分情况都会带来风险。这里面涉及new, malloc, GlobalAlloc, HeapAlloc, LocalAlloc,VirtualAlloc等函数的区别。
free(*add(a,b));显然是写错了,应该是free(add(a,b));才对。改后从原理到语法都是正确的,是完全合法有效的。但为了释放内存,要调用两次自定义函数add这种操作值得吗?回答肯定是否定的;再说调用两次自定义函数就进行了两次malloc操作,释放的只是第二次调用申请的内存,第一次调用时申请的内存并没有释放,所以还是在主调函数中用一个指针变量接收的好,不然是有所谓内存泄漏的。
free函数的用法释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。
free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便。如在分配指针时,用的是new或new[]。
在释放内存时,并不能图方便而使用free来释放。反过来,用malloc 分配的内存,也不能用delete/delete[]来释放。
举例:
int* p = (int *) malloc(4);
*p = 100;
free(p); //释放 p 所指的内存空间
或者:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
……
free(p);
扩展资料
1、free是和malloc、realloc或者calloc函数成对出现的,来保证动态分配的空间及时释放。
2、一块动态申请的内存用free释放一次就够。
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2、函数的用法:
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:
// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
// code...
free(Ptr);
Ptr = NULL;
// code...
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
要free的话首先那块空间得是malloc, calloc, realloc...开辟出来的内存空间, free多少取决于当时alloc出多少.
char* a = (char*)malloc(x*y*sizeof(char));//开辟了x*y个char的空间,(这里是二维的,如果多维就是要多少,开多少);
//相当于a[x][y];
//但是malloc出的空间是堆区的,而数组是在栈区的;两者都是连续的空间;栈空间是有限的,一般会是1k;堆空间相对多些;
......//使用这块空间;
free(a);// 释放空间;
free()释放已分配内存的函数
原形:void
free(void
*block)
功能:释放由calloc、malloc、realloc函数调用所分配的内存。
头文件:stdlib.h、alloc.h
所以你上面所做的和没加free(p)是一样的额
如果内存管理做的好的话,你只能释放你申请的地址,否则不释放。
也就是说free(m+10);
和free(m-1);代码无效
其实什么都没有释放
C语言如何释放指针
;int *c = NULL, *d = NULL;c = b;d = a;\/* 执行大量操作后 *\/ if(a != NULL) free(a);if(b != NULL) free(b);if(c != NULL) free(c);if(d != NULL) free(d);按照这样规定,即使代码再长,以及经过多次设计指针的函数调用,依然不会造成内存泄漏,或内存释放错误!
C语言的free()函数
因为free函数仅仅是告诉操作系统,这一块内存被释放了,可以用来作其它用途。但是,由于你没有重新对这块内存进行写操作,所以内存中的变量数值并没有发生变化。所以输出值不变。通常建议,将这个p用完了也置NULL
关于C语言中free函数的问题
要free的话首先那块空间得是malloc, calloc, realloc...开辟出来的内存空间, free多少取决于当时alloc出多少.char* a = (char*)malloc(x*y*sizeof(char));\/\/开辟了x*y个char的空间,(这里是二维的,如果多维就是要多少,开多少);\/\/相当于a[x][y];\/\/但是malloc出的空间是堆区的,而数组是在...
free函数的形参是无类型指针(void *),而实参可以是别的类型的指针(比如...
free(void *),意味着指针是可以指向任何的类型,即任何类型的指针都可以作为free函数的参数传入。比如:int *p=malloc(sizeof(int)*3); free(p);char *p=malloc(sizeof(char )*3); free(p);struct Test { int a;int b;} struct Test * test;test.a=100; test.b=200; free(test);...
C中 delete 和 free 的区别??谁能清楚得告诉我?
malloc与free是C++\/C语言的标准库函数,new\/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc\/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc\/free是库函数而不是运算符,不在编译器...
c中free函数是什么意思阿?
所谓的释放 是指把你确保的内存空间 交回给系统 但是交回后,系统并不会给这段内存空间的内容做初始化。同时,被交回去的内存并不会马上被系统分配给其他程序,所以你通过指针去访问的话,还是能够看到内容的。但是正如你所考虑到的,如果这段内存被别的应用程序占用的话,你这样访问,会出现很大的...
c语言中的free(void*p)函数,的参数类型是void*类型,如果定义一个指针变...
c语言中的void 指针可以指向任何类型变量。就是说任何类型的指针变量都可以隐式转换成void类型
C语言free函数怎么查看是否成功调用?
与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误 free这个函数没有返回值的哦~不是属于检查是否成功的函数 唯一的办法么,检查你释放...
C语言-动态分配内存 malloc & free
\/\/ 当销毁时只需要free一次,malloc了几个字节就会free几个字节,和char类型还是int类型无关 free(p);在一个函数中动态分配的内存,在另一个函数中操作这块内存 (1) MM是一个系统级的东西,所有的应用程序都向同一个MM申请内存。(2) 何为借出?实际上,在内存被借出时,MM只是把它管理的内存...
C语言的new函数和free函数问题
>>并不是. 注意newp在申请成功时,是newp+=n;也就是根据申请的n值, 每次newp是移动的, 比如, 先申请了500个字节,那么此时newp=newbuf+500, 再申请512个字节,就会导致判断不成立,返回NULL.同时,即使是newp=newbuf时, 如果n大于1000, 那么一样会返回NULL.<<< 然后是free函数的问题,是不是就是...
管钱丽科: 不可以的. malloc, alloc, free是c定义的一组内存管理的API函数,当你调用malloc、alloc分配内存时,不仅仅是从堆里面分配得到了可用内存,实际上内存管理子系统还会维护了内存列表.你自己定义的指针不会在这个列表中的,所以free会出问题的.那么,使用new, GlobalAlloc之类的方式分配的内存可不可以使用free呢.我的回答是,尽量不要,大部分情况都会带来风险.这里面涉及new, malloc, GlobalAlloc, HeapAlloc, LocalAlloc,VirtualAlloc等函数的区别.
商水县13793844087: C语言中free函数的用法 - ?
管钱丽科: free函数的用法释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配. free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便.如在分配指...
商水县13793844087: c语言中 free的用法~ - ?
管钱丽科: malloc用来动态申请内存空间,而free用来释放malloc申请的空间.如: struct { int a; int b; }node; main() { node *lnode; lnode->a=33; lnode->b=99; lnode=(node*)malloc(sizeof(node)); printf("a=%d b=%d",lnode->a,lnode->b); free(lnode); return 0; }
商水县13793844087: c 语言free函数用法?
管钱丽科: free()释放已分配内存的函数 原形:void free(void *block) 功能:释放由calloc、malloc、realloc函数调用所分配的内存. 头文件:stdlib.h、alloc.h 所以你上面所做的和没加free(p)是一样的额
商水县13793844087: c语言free的作用 - ?
管钱丽科: malloc 和 free 是在系统的栈上分配空间. malloc是申请,意思就是告诉系统,我要用一块RAM,给我用了别人就不要用了. free是释放,意思是告诉系统,给我的这块RAM我用完了,不再用了,系统可以把它干别的了.free之后,系统还没有拿这块RAM干别的事之前,这块RAM的内容可能是不会变的,依然可以读出原来的内容,因为你的指针a还是指向这块RAM.但要注意,这块RAM已经不属于你了,读一下内容无所谓,如果往里面写就很危险了.
商水县13793844087: c 语言中的free 函数 用法 - ?
管钱丽科: 不能.FREE不能依靠单纯的指针去释放. 你去看看BMP文件的结构,看看很多的程序的结构,他们的结构体中都会存有数据的大小,而且因为面对的是数据流,所以大小往往被放在最开头. 同样的,你MALLOC(10) ,实际上一定会大于10,它要在内部去存储开辟内存的大小的数据,依次来决定释放的字节.看见p - 2 的数值了吗?它就是14:10个字节的MALLOC,4字节是大小数据单元. FREE就是根据那个数值才知道到底释放多少的.
商水县13793844087: c语言free 函数 - ?
管钱丽科: 如果内存管理做的好的话,你只能释放你申请的地址,否则不释放.也就是说free(m+10); 和free(m-1);代码无效 其实什么都没有释放
商水县13793844087: C语言中free的用法 - ?
管钱丽科: for循环一结束,局部变量ps的所申请的空间就会释放
商水县13793844087: 关于在C语言中使用free()的问题? - ?
管钱丽科: 这个错误虽然在free时报错,但是错误不是free导致的. *(C_pt + sizeof(int)) = 2; 这里你在访问C_pt指向的内存的第5个int,而你只分配了4个int的内存,因此你的代码出现内存访问越界,当然有问题.这可能是你对C_pt+运算符的含义理解错误导致的.底下的没有越界,当然没问题
商水县13793844087: C语言里是不是free()函数只能用来释放通过malloc建立的内存空间? - ?
管钱丽科: 如果不适用free释放内存,会造成内存泄露.随着程序的运行,程序所占内存越来越多,知道系统奔溃或者程序结束. 1、free函数: 原型:void free(void *ptr); 功能:释放malloc(或calloc、realloc)函数给指针变量分配的动态内存; 头文件:...