c语言,函数执行完c语言释放内存函数的相关问题。

C语言内存(堆内存\栈内存)操作函数大全-linux-电脑编程网C语言内存(堆内存\栈内存)操作函数大全作者: 刘一痕  和相关&&
C语言跟内存分配方式  (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等.其中alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.calloc则将初始化这部分的内存,设置为0. 而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放. 而sbrk则是增加数据段的大小;malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序 malloc的大小超出了库里所留存的空间,那么将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os, 而是保留在内部结构中. 可以打个比方: brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求.这套机制类似于缓冲.使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对户态和核心态的转换. 函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用malloc()<SPAN style="FONT-SIZE: 16 COLOR: FONT-FAMI
相关资料:|||||||C语言内存(堆内存\栈内存)操作函数大全来源网络,如有侵权请告知,即处理!编程Tags:                &                    C语言中一些容易被人忽略的东西 之一[内存的分配与释放]
最近在看一本C语言书,感觉挺不错的,但书中有些错误。同时又发现了一些容易被自己或者大家都容易忽略掉的东西,于是记下来跟大家分享下,文中内容如有错误还望大家一定帮忙指出下,谢谢!
一、内存的分配与释放
学过C语言的都知道,内存分配了用完之后是要释放的,都是到malloc和calloc函数以及free函数。那么分配了内存之后是不是真就free(pointer)这么简单呢?
这里提及要注意的地方,参数pointer必须是调用malloc或calloc函数后返回的指针,而给free函数传递其它的值可能会造成死机或者结果是灾难性的。重点是指针的值,而不是用来申请动态内存的指针本身。
可以看下代码,
假如先前有void * p =malloc(sizeof(double)*6);
也有double * dp=(double *)(malloc(sizeof(double)*6));
那么此刻如果free(dp)就会出现不可预知的错误,free(p)是正确的,
若又p=dp,(或者p=(void *)dp),然后free(p)也是正确的
所谓灾难性的无非就是释放内存中出现把不该释放的东西给释放了,然后引起了一些问题。
那么,怎么来验证free(dp)就是错误的呢?这也许是个内存泄露的问题,呵呵。
可以试下这样一段代码:
double * p=malloc(sizeof(double)*6);
然后,看看你的内存是否超支(不够)了?
再看看realloc函数,它可以用来重新分配经m,c,r三者分配的内存。那么重新分配真的是给一块新的地址嘛?
事实上并不是这样的,r有两个参数,一个是指针,引用之前分配的内存,重新分配的内存是在原来基础之上,大小则由第二个参数决定。也就是说,如果你家庭总收入6000元,总管(通常是母的)给儿子分配了1000元的零花钱,现在由于一些&不可抗力&因素,要重新分配money,那么,传递参数realloc(1000元的地址,newsize),newsize&=1000U。而本质上是将儿子手中的money根据newsize抽走一部分,然后剩下的会做一些处理。
动态内存分配的一些原则:
1、需要时分配,用完就释放,特别是堆上的(资源很有限)。
2、避免分配大量小块内存,因为堆上内存的分配由于有开销,所以分配许多的小内存比分配几块大内存开销要大,而已不便于释放和管理。
3、的时候始终把用户有限的内存放在心上,分配了就要考虑在哪里释放。
4、循环中分配内存一定要小心翼翼
5、释放内存之前,确保不会无意中覆盖堆上分配的内存地址,否则会出现内存泄露
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'DS/ACM(26)
char* toStr()
char *s = &abcdefghijkl&;
int main()
cout && toStr() &&
return <span style="color:#;
char* toStr()
char s[] = &abcdefghijkl&;
int main()
cout && toStr() &&
return <span style="color:#;
  两段代码都很简单,输出一段字符,类型不同,一个是char*字符串,一个是char[]数据。
  结果你知道吗? 这个我确实知道,相信大部分人也都回知道,必然有一个不好使,或者两个都不好使!!!都对就没意思了~
  结果:第一个正确输出,第二个输出乱码。
  原因:在于局部变量的作用域和内存分配的问题,第一char*是指向一个常量,作用域为函数内部,被分配在程序的常量区,直到整个程序结束才被销毁,所以在程序结束前常量还是存在的。而第二个是数组存放的,作用域为函数内部,被分配在栈中,就会在函数调用结束后被释放掉,这时你再调用,肯定就错误了。
  什么是局部变量、全局变量和静态变量?
  顾名思义,局部变量就是在一个有限的范围内的变量,作用域是有限的,对于程序来说,在一个函数体内部声明的普通变量都是局部变量,局部变量会在栈上申请空间,函数结束后,申请的空间会自动释放。而全局变量是在函数体外申请的,会被存放在堆上,知道程序结束后才会被结束,这样它的作用域就是整个程序。静态变量和全局变量的存储方式相同,在函数体内声明为static就可以使此变量像全局变量一样使用,不用担心函数结束而被释放。
相关函数:
void *malloc(size_t size);
void free(void *p);
/*一般这样用
Struct elem *p;
p = (struct elem*)malloc(sizeof(struct elem))
void free(p)
malloc原理
  malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回&#20540;的判断。
栈区(stack)—由编译器自动分配释放,存放函数的参数&#20540;,局部变量的&#20540;等。其操作方式类&#20284;于数据结构中的栈。
堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类&#20284;于链表
全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态   变量在相邻的另一块区域。 程序结束后由系统释放。
常量区—常量字符串就是放在这里的,直到程序结束后由系统释放。上面的问题就在这里!!! 代码区—存放函数体的二进制代码。
直接搬运的代码,确实很好!!容易理解
//main.cpp
int a = <span style="color:#; //全局初始化区
char *p1; //全局未初始化区
char s[] = &abc&; //栈
char *p2; //栈
char *p3 = &<span style="color:#3456&; //<span style="color:#3456\\0在常量区,p3在栈上。
static int c =<span style="color:#;//全局(静态)初始化区
p1 = (char *)malloc(<span style="color:#);
p2 = (char *)malloc(<span style="color:#);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, &<span style="color:#3456&); //<span style="color:#3456\\0放在常量区,编译器可能会将它与p3所指向的&123456&优化成一个地方。
此外,还有realloc(重新分配内存)、calloc(初始化为0)、alloca(在栈上申请内存,自动释放)等。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:235624次
积分:1946
积分:1946
排名:第16091名
原创:76篇
转载:116篇
评论:10条
(2)(3)(1)(2)(2)(4)(7)(8)(1)(1)(4)(1)(3)(1)(1)(5)(4)(21)(4)(9)(12)(3)(26)(2)(15)(48)(7)2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 c语言 链表 释放内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信