C:动态内存分配及系列函数浅析

动态内存分配
malloc&free

void* malloc(size_t size)

开辟失败返回一个NULL指针,所以malloc返回值需要进行检查;
如果参数size为0,malloc的行为是未定义的,取决于编译器(黄赌毒);为负数会创建一个很大的空间(参数是无符号型的);
free的参数ptr指向的空间不是动态开辟的-未定义,ptr为NULL,啥事也不做;
推荐free后把指针手动赋NULL;

calloc

void*calloc(size_t num,size_t size)

会自动初始化空间里的每个字节为0;malloc不自动初始化里面存放的是上次用过的残留值(垃圾值);也要搭配free;

realloc

void *realloc( void *memblock, size_t size );

对malloc和calloc扩容;内存后面空间足够容纳扩容后的空间直接扩,不够另找一块连续空间数据拷过去;

常见动态内的错误
  1. 判断malloc申请不到,反回是不是NULL(改错常问)NULL解引用程序要跪;
  2. free必需搭配malloc系列使用;new内存free使用也是未定义行为用Delet搞;
  3. free与malloc成对出现不可连续调用两次以上;
  4. 未释放修改指针,导致内存泄露;加上const避免;
  5. 地址偏移哪怕还在动态分配内存里,也会未定义;
  6. 注意函数返回的参数是不是一个局部变量

Linux下内存空间布局
成员名空间大小储存数据类型运行效率
高地址可配置但有限(较小)局部变量内存效率极高,速度极快
与内存总大小有关(极大)动态开辟的空间效率较低
数据段(静态区)较小静态变量,全局变量
低地址代码段较小存放代码,常量

什么是内存泄漏

没有free的空间,在程序停止运行前是不会释放的,如果不断申请而不释放,会大量占用内存,这就是内存泄漏,在服务器工作中极为致命;
Java使用垃圾回收机制,STW问题;C++智能指针防止各种的泄露;
检测方法:采样抓取内存使用状况;


tips:
  • 字节换算内存大小:十亿-GB,百万-MB,千-KB;
  • main函数的返回值就是进程的推出码;结果错误return 1;
  • 内存达到50%就要报警;
    yo~
    yo~
    如果觉得不错~
    请别忘了点个赞~
    Bro你的鼓励~
    给我坚持的勇气~
    Peace out~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值