C/C++中动态内存分配问题
来源:互联网 发布:js 字符串函数 编辑:程序博客网 时间:2024/04/30 01:28
C和C++中都可以使用malloc、calloc、realloc三个库函数来在堆区动态开辟出一段内存块。并都可以用free()函数来释放掉开辟出来的内存,以便后续使用,避免造成内存泄漏(memory leak)。
调用三个函数必须包含头文件 < stdlib.h >
malloc函数 原型为 void* malloc(size_t size )。开辟一块连续的大小为size字节的空间。void *返回值表示试用于任何的数据类型。
例如:
int * p1 = (int * )malloc(sizeof(int)* 10);
开辟出40字节的空间,并返回首地址给p1,强制类型转换为 int *。
但不能随意修改开辟出来的内存块以外的值。
这里给P1开辟了10个int大小的空间,但访问了p1[10]不属于该空间,系统崩溃。
calloc 函数也用于分配动态空间。在分配好空间的时候初始化该空间中的值为0.
原型为 void * calloc (size_t n,size_t size )。两个参数分别是 n为要初始化的变量个数 size是要初始化的变量大小。
例如:
int * p2 =(int * )calloc (10, sizeof ( int ));
两者的区别是:malloc开辟出来的空间里存放的是随机值。而calloc里面默认初始化为0。
图中的p1 和p2 分别指向的空间内存放的值。p1为随机值 p2里为0。
realloc 函数 功能是扩容,重新分配内存空间。
realloc
Reallocate memory blocks.
函数原型 void *realloc( void *memblock, size_t size );
当第一个参数 指针为NULL的时候 该函数和malloc函数一模一样。
如果不为空。它会从该指针后开始找size大小的空间进行开辟,如果未找到相应大小的内存块,则在其他地方找想要的大小的内存块,并把以前开辟出的内存块里的内容进行Copy。最后返回新内存块的首地址。
★内存泄漏如何检测
“该死的内存泄漏问题“,系统长时间运行之后会出现内存越来越少的现象,内存泄漏是常见的难以发现的问题。
内存泄漏是疏忽或错误造成的系统未能释放已经不再使用的内存,并非是指内存在物理上的消失.而是程序设计错误,导致释放内存之前就失去了对该内存块的控制导致的内存浪费。
windows系统下VS调试器CRT库为我们提供了一个检测内存泄漏的有效方法,原理是:内存分配要通过CRT运行时实现,只要在分配和释放时分别做好标记就可以检测出来是否有内存释放。
#include<stdlib.h>#include<stdio.h>#include<crtdbg.h>#define _CRTDBG_MAP_ALLOCint main(){ int *p1 = (int *)malloc(sizeof(int)* 10); int *p2 = (int *)calloc(10, sizeof(int)); if (p1 == NULL) printf("out of memory!\n"); //free(p1); //free(p2); if(_CrtDumpMemoryLeaks()) printf("memory leak!!!! \n"); else printf("not found memory leak.\n"); return 0;}
以上程序为free释放内存,则会打印出来”memory leak!!!!“,
但如果加上free释放会打印not found memory leak.
- C/C++中动态内存分配问题
- c 动态内存分配
- c动态内存分配
- C动态内存分配
- 【C++】动态内存分配
- C动态内存分配
- C动态内存分配
- C动态内存分配
- C---动态内存分配
- c和c++中动态内存分配
- C语言中动态内存分配
- C内存分配问题
- c语言中内存分配问题
- C语言动态内存分配
- C中的动态内存分配
- C++/CLI 动态内存分配
- 【C基础】动态内存分配
- C语言动态内存分配
- 横向居中的RecyclerView
- 推荐2本学习Modbus通信协议的资料书
- OpenCV——将图片转换成视频
- 嬉皮笑脸面对明天的“难”
- selenium chromedriver镜像下载地址
- C/C++中动态内存分配问题
- spring quartz Could not open JDBC Connection for transaction; 错误
- 深入理解groupByKey、reduceByKey
- Redis 入门安装(Linux)
- 如何用正确的姿势查看 主机系统的CPU信息
- Android
- web开发-安装软件-学习笔记一
- mybatis-generator 代码自动生成工具(maven方式)
- Android 由于SDK版本不同setUserVisibleHint造成的nullPointerexception