C/C++动态内存tcy
发布日期:2021-06-29 14:44:10
浏览次数:3
分类:技术文章
本文共 4848 字,大约阅读时间需要 16 分钟。
动态内存管理 2020/3/15C++推荐用容器1.1.概念:1) 栈stack:在函数内部声明的所有变量都将占用栈内存。2) 堆heap:这是程序中未使用的内存, 在程序运行时可用于动态分配内存。3) 当对象在stack上时析构函数自动调用;在heap上时需调用delete后析构函数才会被执行4) delete不能删除stack上指针值;只能删除heap上指针值(也就是new出来的对象)1.2.头文件:malloc.h(ANSI标准建议用stdlib.h,但很多编译器可能不支持)1.3.强制类型转换: char *arr = malloc( 200 * sizeof(char) ); // C 语言正确 char *arr = (char *)malloc( 200 * sizeof(char) ); // C++必须强制类型转换1.4动态变长结构体: typedef StructType{ int id;char name[0];}sType;//占用4字节内存,name不占内存 sType *s = NULL; s = malloc(sizeof(*s) + 100);//sizeof(*s)=4;4字节给id成员用,100字节属于name成员 s->id = 1010; strcpy(s->name,"hello"); //一结构体中只有一个可变长成员,且必是最后一个成员 1.5.注意:1)禁止访问空指针;在对指针赋值前,要确保没内存位置会变为孤立;2)内存分配都应有分配/释放配对;只释放动态分配的内存; 用free释放malloc,realloc,calloc;不能释放aligned_alloc内存分配函数分配的内存空间3)释放结构化元素由内向外4)正确处理返回动态分配的内存引用的函数返回值, 在引用中释放5)内存释放后必须为指针赋一个新值NULL;指针被释放后, 指针变量本身并没有被删除;
2.函数:来实现对内存区域的堆上内存进行管理1) void*calloc(size_t count,size_t size) //C分配连续内存区域,每字节初始化为02) void*malloc(size_t size) //C分配连续内存区域,值未知 //返回值:返回分配内存区域首字节地址或NULL3) void *realloc(void *address, size_t newsize); //C调整已分配的内存区域 //参数1指向堆内动态分配内存;参数1重分配大小(=0时返回NULL并不代表指针被释放)4) void free(void *address); //C释放已分配的内存区域5) new int[2]/delete[] p3.实例:实例1: #include#include #include int * p =NULL; p= (int *) malloc(sizeof(int) * 10);//从堆中动态分配40字节内存空间 memset(p , 0 , sizeof(int)*10); //内存空间初始化 for(int i = 0;i < 10;i++)a = *(p+i); free(p);p=NULL; int * p1= NULL; p1 = (int *)calloc(10, sizeof(int));//不需要memset进行初始化 free(p1);p1=NULL;
实例2:2.1) int * arr = new int[M]; //C++ 1D数组M分配内存 delete[] arr; //C++ 1D释放内存2.2) int ** arr = new int *[M]; //C++ 2D数组M*N分配内存 for (int i = 0; i < M; i++) arr[i] = new int[N]; for (int i = 0; i < M; i++) //C++ 2D释放内存 delete[] arrary[i]; delete[] arr;2.3) int *** arr = new int **[M]; //C++ 3D数组M*N*H分配内存 for (int i = 0; i < M; i++) { arr[i] = new int *[N]; for (int j = 0; j < N; j++) arr[i][j] = new int[H]; } for (int i = 0; i < M; i++) //C++ 3D释放内存 { for (int j = 0; j < N; j++) delete[] arr[i][j]; delete[] arr[i]; } delete[] arr;===========================================================================================实例3:1)new类型检查;自动计算类型大小;分配内存的同时创建对象2)内存先分配外层,在分配内层,释放则相反3)返回值正确处理int *_arr(void){return (int *)malloc(10 * sizeof(int));}int main(){ int *arr = _arr(); for (int i = 0; i < 10; i++) arr[0] = i; for (int i = 0; i < 10; i++) printf("%d; ", arr[0]); free(arr);}
实例4:int * pvalue = NULL;if (!(pvalue = new int)){ cout << "Error: out of memory." << endl; exit(1);}==============================================================================================实例5:2D数组#include#define M 3#define N 4#define H 2using namespace std;int main(){ int i, j, r = 0; int **p = new int *[M];//分配内存 for (i = 0; i < M; i++) p[i] = new int[N]; for (i = 0; i < M; i++)//数组初始化 { for (j = 0; j < N; j++, r++) p[i][j] = r; } for (i = 0; i < M; i++)//显示 { for (j = 0; j < N; j++) cout << setw(2) << p[i][j] << "; "; cout << endl; } for (i = 0; i < M; i++)//释放内存 delete[] p[i]; delete[] p; return 0;}===============================================================================================实例6:3D数组int main(){ int i, j, k,r=0; int *** p = new int **[M];//分配内存 for (i = 0; i < M; i++) { p[i] = new int *[N]; for (j = 0; j < N; j++) p[i][j] = new int[H]; } for (i = 0; i < M; i++) //数组初始化 { for (j = 0; j < N; j++) { for (k = 0; k < H; k++,r++) p[i][j][k] = r; } } for (i = 0; i < M; i++) //显示 { for (j = 0; j < N; j++) { for (k = 0; k < H; k++, r++) cout << setw(2) << p[i][j][k] << "; "; cout << endl; } cout << endl; } for (i = 0; i < M; i++) //释放内存 { for (j = 0; j < N; j++) delete[] p[i][j]; } for (i = 0; i < H; i++) { delete[] p[i]; } delete[] p;}
4.备注:C++摒弃C中realloc()函数在C中realloc()可改变已分配内存区大小。他仅保证能工作于这样的数组之上:它们被malloc()(或类似函数)分配,包含一些没有用户定义的复制构造函数(copy constructors)的对象而且要记住与通常的期望相反,realloc()有时也必须复制它的参数数组。在C++中处理内存重新分配更好方法是使用标准库中容器如vector,并让它自我增长。C++里没有realloc不是遗憾,而是精心选择和淘汰的结果。 在C里realloc一般而言是重新分配一块空间,然后把旧空间的内容copy到新空间里去。而对象空间怎么copy?是copy字节还是用copy constructor?无论哪个都不合适。那种想在原地(即首地址不动)就把申请内存空间扩大的思想不是一个好思想。如实在想做类似于realloc()函数操作参考:#includeusing namespace std;int main() { int *oldbuf = new int[5]; int *newbuf = new int[10]; for (int i = 0; i < 5; i++) { oldbuf[i] = i; } std::copy(oldbuf, oldbuf + 5, newbuf); delete[] oldbuf; for (int i = 5; i < 10; i++){newbuf[i] = i;} cout << "["; for (int i = 0; i < 10; i++){cout << newbuf[i] <<",";} cout<<"]"<
转载地址:https://chunyou.blog.csdn.net/article/details/104879403 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月27日 08时26分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
利用MySQL进行数据复杂查询(1)
2019-04-29
利用MySQL进行数据复杂查询(2)
2019-04-29
MySQL 表与表之间的关系
2019-04-29
MySQL常见错误总结
2019-04-29
pymysql 的基础应用
2019-04-29
Python 管理程序改进——连接MYSQL
2019-04-29
Python 爬虫-豆瓣影星图片下载
2019-04-29
网页端数据库操作界面—主题函数文件
2019-04-29
网页端数据库操作界面-Html页面(1)
2019-04-29
Python爬虫 百度热搜热点
2019-04-29
excel的常用函数(二)
2019-04-29
excel文本函数
2019-04-29
电商大战二十年
2019-04-29
编程程软件测试思维方式:如何科学制定测试计划
2019-04-29
BLE蓝牙4.0串口调试助手
2019-04-29
树莓派WIFI设置
2019-04-29
nanopi2 启动信息
2019-04-29
phpstudy https
2019-04-29