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()
- C和C++中内存分配和释放使用介绍
- c和c++中的内存分配和内存释放函数
- C和C++动态内存分配和释放的区别
- C和C++分配和释放内存的区别
- C和C++动态内存分配和释放的区别
- C和C++动态内存分配和释放的区别
- C和C++动态内存分配和释放的区别
- C和C++动态内存分配和释放的区别
- C和C++动态内存分配和释放的区别
- C语言指针应用——内存分配和释放
- C/C++动态二维数组的内存分配和释放 .
- C/C++动态二维数组的内存分配和释放
- [C++](CQ之一)内存的分配和释放
- C语言中多维数组的内存分配和释放(malloc与free)
- C语言中多维数组的内存分配和释放(malloc与free)(转)
- C/C++——C和C++怎样分配和释放内存,区别是什么?
- 内存分配和释放
- 内存分配和释放
- HDU 3608 最长回文 manacher算法
- Centos7安装Shadowsocks并支持chacha20且开启bbr
- 机器学习笔记
- 落尘曦的博客打赏名单
- 将方法作为参数传递(Javascript/Ruby)
- C和C++中内存分配和释放使用介绍
- 机器学习实战之程序清单1-kNN(手写数字识别系统)
- Java方法对传递参数的处理
- JZOJ5400. 【NOIP2017提高A组模拟10.7】Repulsed 树型DP+贪心
- 快速解决centos7的防火墙问题
- golang fmt格式化字符串%v,%T
- IO多路复用之select全面总结(必看篇)
- 心路历程(绪论)
- 洛谷1489 猫狗大战