您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-07 22:56 267 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 malloc