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()函数操作参考:#include
using 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++:引用及引用作为类成员变量 tcy
下一篇:VS内存泄漏检查 tcy

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月27日 08时26分22秒