【C++】一篇带你了解C++中的动态内存管理
首先我们先了解一下C/C程序内存分配的几个区域代码语言javascriptAI代码解释int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1; int num1[10] { 1, 2, 3, 4 }; char char2[] abcd; const char* pChar3 abcd; int* ptr1 (int*)malloc(sizeof(int) * 4); int* ptr2 (int*)calloc(4, sizeof(int)); int* ptr3 (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); }栈区在函数运行时函数内的局部变量的储存单元会在栈上被创建在函数执行结束时这些储存单元会被自动释放。堆区一般是由程序员自主分配和和释放的如果最后没有被释放的话可能由OS回收。数据段静态区存放全局变量、静态变量。程序结束后由系统自动回收。代码段常量区存放常量、函数体类成员函数、全局函数的二进制代码。从上面那副图中我们可以清晰的看到函数体中的局部变量都是在栈(stack)上分配空间的而它们一出作用域就会被释放。而有static修饰的静态变量是储存在数据段的而在数据段上创建的变量会在程序运行结束后销毁也就是静态变量的数据周期更长。2. C语言中的动态内存管理方式malloc/calloc/realloc/free在C语言中我们通常使用malloc、calloc、realloc来进行内存的动态分配同时提供了free来进行内存的释放和回收。而这三个内存分配的函数我们要重点强调它们的区别和使用。2.1. malloc、calloc、realloc三者的区别在哪malloc是申请一块连续的内存并返回指向这块内存的指针calloc与malloc的功能一样只不过在返回指针之前将所有申请到的空间的字节初始化为0realloc能够实现对空间的动态调整我们从对着三个函数的定义也能看到区别代码语言javascriptAI代码解释void Test() { int* p1 (int*)malloc(sizeof(int)); cout sizeof(p1) endl; free(p1); int* p2 (int*)calloc(4, sizeof(int)); int* p3 (int*)realloc(p2, sizeof(int) * 10); cout sizeof(p2) endl; cout sizeof(p3) endl; free(p3); }3. C中的内存管理方式我们当然知道C肯定是兼容C语言的内存管理方式的但是有的时候C的内存管理方式确实无能为力这时候就需要用到C自己的内存管理方式使用new、delete操作符进行动态内存管理。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417192.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!