动态内存分配
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扩容;内存后面空间足够容纳扩容后的空间直接扩,不够另找一块连续空间数据拷过去;
常见动态内的错误
- 判断malloc申请不到,反回是不是NULL(改错常问)NULL解引用程序要跪;
- free必需搭配malloc系列使用;new内存free使用也是未定义行为用Delet搞;
- free与malloc成对出现不可连续调用两次以上;
- 未释放修改指针,导致内存泄露;加上const避免;
- 地址偏移哪怕还在动态分配内存里,也会未定义;
- 注意函数返回的参数是不是一个局部变量;
Linux下内存空间布局
成员名 | 空间大小 | 储存数据类型 | 运行效率 | |
---|---|---|---|---|
高地址 | 栈 | 可配置但有限(较小) | 局部变量 | 内存效率极高,速度极快 |
堆 | 与内存总大小有关(极大) | 动态开辟的空间 | 效率较低 | |
数据段(静态区) | 较小 | 静态变量,全局变量 | ||
低地址 | 代码段 | 较小 | 存放代码,常量 |
什么是内存泄漏
没有free的空间,在程序停止运行前是不会释放的,如果不断申请而不释放,会大量占用内存,这就是内存泄漏,在服务器工作中极为致命;
Java使用垃圾回收机制,STW问题;C++智能指针防止各种的泄露;
检测方法:采样抓取内存使用状况;
tips:
- 字节换算内存大小:十亿-GB,百万-MB,千-KB;
- main函数的返回值就是进程的推出码;结果错误return 1;
- 内存达到50%就要报警;
yo~
yo~
如果觉得不错~
请别忘了点个赞~
Bro你的鼓励~
给我坚持的勇气~
Peace out~