动态内存管理总结
Posted 水澹澹兮生烟.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存管理总结相关的知识,希望对你有一定的参考价值。
动态内存管理
**
1.在函数内部定义变量,我们称之为局部变量,空间开辟在栈区,称之为静态开辟
2.系统内存:栈区(局部变量,函数的参数,临时变量,空间的回收是自动的),堆区(malloc,动态开辟,手动回收),静态常量区(static,char ar[]=“sdfgh”;char* str=“sd”😉
**
1.动态开辟函数:
int* pa;//他没有指向合法的空间,它内部没有存放一个有效地址,但它本身会开辟空间
2.头文件
#include<malloc.h>
3.malloc()函数
void* malloc(size_t size);
int* pa=malloc(sizeof(int)*10);//大小必须自己计算,在堆区申请;在返回时必须进行检测;返回值必须强转
在申请完成后,判断返回值
if(pa==NULL){
//空间申请失败
}
或者使用断言
assert(pa!=NULL);
在释放指针之后为了杜绝野指针,在free(ptr);后面对指针进行赋空值,ptr=NULL;
4.free()函数
用来释放动态内存
杜绝越界访问,越界访问会造成不可以正常释放
释放之后的指针,称之为野指针
5.头文件
#include<vld.h>//检测动态内存泄露
内存泄漏:指申请了空间,现在没有办法进行释放
6.calloc()函数
void* calloc(size_t num,size_t size);
不同:可以自己计算大小;他赋值时会用0初始化
#include<memeory.h>
memset(pa,0,sizeof(int)*10);//进行初始化
7.realloc()函数
void* realloc(void* memblock,size_t size);
pa=(int*)realloc(pa,sizeof(int*10);//对原有空间重新申请,将之前空间的内容
拷贝过来,在释放之前的空间
作用:对动态内存大小的调整
**
自己实现函数:
1.realloc(ovid8 memblock,size_t size); --缺少如何判断是否可以在其后面进行申请
void my_realloc( void* memblock,size_t size){
//既可以把空间调大,也可以将空间调小
vod* new_base=malloc(size);//申请新空间
memcpy(new_base,memblock,size);//将原来的没数据进行拷贝
free(memblock);//将原来的空间进行释放
return new_base;//返回现在的数据
}
**
1.常见错误
2.vld.h
.dll 动态链接库
.lib 静态链接库
**
1.柔性数组
柔性 数组 成员
typedef struct test{//属于结果提里面的成员,他是一个是数组,
int len;
int c[0];//他不占空间,它只能放在最后面
}
int main(){
text* pt=(text*)malloc(sizeof(pt)+len+1);//申请空空间
`
`
`
free(pt);
}
**
并非所有动态开辟空间都可以用free()进行释放,并非所用动态申请的空间都在堆区,也有可能在栈区
以上是关于动态内存管理总结的主要内容,如果未能解决你的问题,请参考以下文章
操作系统-3.3-内存(动态分区分配算法&&基本分页存储管理详解)