C和C++中内存分配和释放使用介绍
2017-10-07 22:56
267 查看
C语言和C++都提供了动态内存分配方法,C语言提供的是库函数:malloc、calloc、realloc、free等,而C++语言提供的是运算符:new()、new[]、delete()、delete[]。
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。
malloc函数只有一个参数表示,要申请的内存的字节大小,返回申请的空间的首地址。示例代码:
2、realloc
void realloc(void mem_address,unsigned int newsize);
第一个参数是指向堆内动态分配的内存,第二个参数表示重新分配的大小(当该参数为0时,返回NULL,并不代表指针被释放),事实上该函数主要用来扩大动态分配区域,即当第二个参数n大于第一个参数p指向的动态内存大小,这个时候,将重新申请一个大小为n的空间,而之前的空间归还给堆。示例代码:
3、calloc
void *calloc (size_t nmemb, size_t size);
和malloc用法类似,第二个参数表示要分配的字节单元大小,第一个参数表示要分配多少个这样的字节单元,例如:p=(int *) calloc(10 , sizeof(int));是分配10乘sizeof(int)个字节即40个字节的空间,与malloc不同的是,动态分配完内存后,自动初始化该内存空间为零。当然如果执行成功返回指针首地址,执行不成功返回NULL。示例代码:
有关构造函数的介绍,参考链接:[http://blog.csdn.net/legend_hua/article/details/78175352 ]
执行下述的验证代码
输出结果:
一、前言
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、 mallocvoid *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++ 使用动态内存分配的类需要显式复制构造函数,赋值构造函数,析构函数
- 全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存
- 使用二级指针分配和释放内存示例 malloc(), free()
- 全面介绍Windows内存管理机制及C++内存分配实例 之 虚拟内存
- 使用CRT调试内存分配堆来找出未释放的内存空间
- c++ 基类、派生类都使用了动态内存分配的实例
- 全面介绍Windows内存管理机制及C++内存分配实例(六):堆栈
- C与C++中内存分配释放-malloc,free,new,delete
- 全面介绍Windows内存管理机制及C++内存分配实例之虚拟内存(2)
- [转]全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 全面介绍Windows内存管理机制及C++内存分配实例之虚拟内存(3)
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- C/C++程序的内存分配与使用笔记
- C++中vectors内存分配的使用方法
- 介绍下C++中的内存分配
- 全面介绍Windows内存管理机制及C++内存分配实例
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- C++中vectors内存分配的使用方法
- 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间 zz