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.
这里写图片描述

0 0
原创粉丝点击