C和C++中内存分配和释放使用介绍

来源:互联网 发布:冒险岛数据库查询器 编辑:程序博客网 时间:2024/06/07 06:05

C语言和C++都提供了动态内存分配方法,C语言提供的是库函数:malloc、calloc、realloc、free等,而C++语言提供的是运算符:new()、new[]、delete()、delete[]。

一、前言

C语言中动态存储分配函数头文件malloc.h(ANSI标准建议使用stdlib.h,但很多编译器可能不支持),提供许多函数来实现对内存区域的堆上内存进行管理,主要有:
void *malloc(unsigned int num_bytes);
void realloc(void mem_address,unsigned int newsize);
void *calloc (size_t nmemb, size_t size);
C++中在保留C语言中上述管理内存函数的基础上,增加了new和delete的运算符。new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator delete。

二、C语言

1、 malloc

void *malloc(unsigned int num_bytes);

malloc函数只有一个参数表示,要申请的内存的字节大小,返回申请的空间的首地址。示例代码:

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>  //memset头文件int main(){    int * p= NULL;    p=(int *)malloc(sizeof(int)*10);    memset(p,0,sizeof(int)*10);//初始化申请的空间    if(p!=NULL)    {        int a;        int i;        for(i=0;i<10;i++)        {            a=*(p+i);            printf("%d\n",a);        }        free(p);//释放p指针    }    return 0;}

2、realloc

void realloc(void mem_address,unsigned int newsize);

第一个参数是指向堆内动态分配的内存,第二个参数表示重新分配的大小(当该参数为0时,返回NULL,并不代表指针被释放),事实上该函数主要用来扩大动态分配区域,即当第二个参数n大于第一个参数p指向的动态内存大小,这个时候,将重新申请一个大小为n的空间,而之前的空间归还给堆。示例代码:

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>int main(){    int * p=NULL;    int * q=NULL;    p=(int *)malloc(sizeof(int)*6);    q=p;    printf("before realloc:\n");    printf("p=%p  q=%p\n",p,q);    p=(int *)realloc(p,sizeof(int)*8);    printf("after realloc:\n");    printf("p=%p  q=%p\n",p,q);    free(p);    free(q);    return 0;}

3、calloc

void *calloc (size_t nmemb, size_t size);

和malloc用法类似,第二个参数表示要分配的字节单元大小,第一个参数表示要分配多少个这样的字节单元,例如:p=(int *) calloc(10 , sizeof(int));是分配10乘sizeof(int)个字节即40个字节的空间,与malloc不同的是,动态分配完内存后,自动初始化该内存空间为零。当然如果执行成功返回指针首地址,执行不成功返回NULL。示例代码:

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>int main(){    int * p= NULL;    p=(int *)calloc(10,sizeof(int));//不需要使用memset初始化    if(p!=NULL)    {        int a;        int i;        for(i=0;i<10;i++)        {            a=*(p+i);            printf("%d\n",a);        }        free(p);//释放p指针    }    return 0;}

三、C++

C++中使用new和delete运算符来分配和释放内存,它们在分配和释放内存的同时,自动执行了构造/析构函数。以下面的coordinate类为例。
有关构造函数的介绍,参考链接:[http://blog.csdn.net/legend_hua/article/details/78175352 ]

class Coordinate{public:    Coordinate(int x,int y)//有参构造函数    {        cout<<"Coordinate()"<<endl;        m_ix=x;        m_iy=y;    }    Coordinate()//无参构造函数    {        cout<<"Coordinate()"<<endl;    }    Coordinate(const Coordinate & coor)    {        cout<<"const Coordinate()"<<endl;    }    ~Coordinate()//析构函数    {        cout<<"~Coordinate()"<<endl;    }private:    int m_ix;    int m_iy;};

执行下述的验证代码

int main(){    Coordinate coor1(3,4);//栈实例化,调用有参构造函数    Coordinate coor2;//栈实例化,调用无参构造函数    Coordinate coor3[3]={Coordinate(5,6),Coordinate(7,8),Coordinate(9,10)};//栈实例化,对象数组    Coordinate *pCoor1=new Coordinate(3,4);//堆实例化    Coordinate *pCoor2=new Coordinate[3];//堆实例化,对象数组    delete pCoor1;//堆实例化,手动删除    pCoor1=NULL;//指向空指针    delete[] pCoor2;    pCoor2=NULL;    return 0;}

输出结果:

Coordinate()Coordinate()Coordinate()Coordinate()Coordinate()Coordinate()Coordinate()Coordinate()Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()~Coordinate()