首页 / 资讯中心 / 文章详情

【C++】动态内存管理——通关指南

【C++】动态内存管理——通关指南 ★ FEATURED ARTICLE
文章目录0. C/C中程序内存区域划分增长方向分配方式析构顺序1.C语言动态内存管理题目2.new and delete2.1内置类型2.2自定义类型3. operator new 和operator delete5.new and delete 实现原理5.1内置类型5.2 自定义类型6.malloc/freenew/delete 区别0. C/C中程序内存区域划分栈区stack局部变量函数参数、返回数据、返回地址等效率高容量有限堆区heap 存放通过 malloc() 等动态分配的内存⼀般由程序员分配释放 若程序员不释放程序结束时可能由OS操作系统回收 。分配⽅式类似于链表。数据段静态区static存放全局变量、静态数据。程序结束后由系统释放。代码段常量区存放函数体类成员函数和全局函数的⼆进制代码 程序里直接写的字符串常量常量区不存常量增长方向栈向下增长就是从高地址向低地址增长。堆向上增长就是从低地址向高地址增长。分配方式堆只能动态分配自己申请new /malloc 栈可静int a 10;可动C99 变长数组 _alloca析构顺序手动释放——自动析构按定义顺序的反向——静态局部对象——全局对象1.C语言动态内存管理题目intglobalVar1;//**常量区不存常量**在静态区/数据段staticintstaticGlobalVar1;//静态区/数据段voidTest(){staticintstaticVar1;//静态区/数据段intlocalVar1;//栈区intnum1[10]{1,2,3,4};//num1是首元素地址在栈区。//num1中的元素可修改也在栈区charchar2[]abcd;//char2是首元素地址在栈区。//char2中的元素可修改也在栈区constchar*pChar3abcd;//pChar3是首元素地址在栈区。//pChar3中的内容是字符串常量**常量区不存常量**在静态区/数据段int*ptr1(int*)malloc(sizeof(int)*4);//ptr1是 地址在栈区。//ptr1中的内容是malloc出的堆区int*ptr2(int*)calloc(4,sizeof(int));//ptr2是 地址在栈区。//ptr2中的内容是calloc出的堆区int*ptr3(int*)realloc(ptr2,sizeof(int)*4);//ptr3是 地址在栈区。//ptr3中的内容是realloc出的堆区free(ptr1);free(ptr3);}1.选择题 选项:A.栈 B.堆 C.数据段(静态区)D.代码段(常量区)char2在哪里____ globalVar在哪里____ staticGlobalVar在哪里____ staticVar在哪里____ localVar在哪里____ num1 在哪里____*char2在哪里___ pChar3在哪里____*pChar3在哪里____ ptr1在哪里____*ptr1在哪里____2.new and delete数组类型用 delete 代替 delete [] 的后果内置类型数组不会崩溃和泄漏但属于未定义行为自定义类型数组少调用 N-1 次析构函数 释放错误地址→内存泄漏 程序崩溃**new 和 delete 必须严格配对 : 单个用 delete数组用 delete [] **2.1内置类型new一个内置类型int*p1newint;new一个内置类型赋值int*p1newint(199);deletep1;new一个内置类型数组int*p2newint[10];new一个内置类型数组赋值全0int*p4newint[10]{0};new一个内置类型数组逐个赋值int*p6newint[10]{3};///只有首元素被赋值int*p5newint[11]{0,2,3};///写了几个初始化几个delete[]p4;delete[]p5;delete[]p6;2.2自定义类型new会调用构造函数delete会调用析构函数classA{public:A(inta,intb1):_a1(a),_a2(b){cout构造函数endl;}A(constAa){cout拷贝构造函数endl;}~A(){cout析构函数endl;}private:int_a122;int_a233;};单个赋值 A*p1newA;A*p2newA(3);deletep1;deletep2;多个 A*p2newA[3];///直接调用3次默认构造多种情况 A*p3newA[3]{aa1,aa2,aa3};///1拷贝构造A*p4newA[3]{A(5,5),A(99,8),A(4,4)};///2拷贝构造被优化为构造A*p5newA[3]{{3,3},{33,66},{88,88}};///3隐式类型转换构造拷贝构造 被优化为构造3. operator new 和operator deletenew底层调用operator new函数申请空间。后者调用malloc失败了会抛异常delete底层调用operator delete函数释放空间。后者实际通过free来释放空间。5.new and delete 实现原理5.1内置类型new delete释放单个元素空间new [] delete []释放连续空间malloc newdelete free基本类似new失败抛异常malloc失败返回空NULL5.2 自定义类型new调用operator new申请空间调用构造函数new T [N]调用operator new[ ],operator new[ ]调用operator new申请N 个对象的空间调用N次构造函数delete析构函数调用operator delete释放空间deleteN 次析构函数调用operator delete[ ],operator delete[ ]调用operator delete释放N 个对象的空间6.malloc/freenew/delete 区别同都是在堆上申请空间都要手动 free/delete释放异malloc/free是函数在stdlib.h头文件中new/delete是操作符malloc/free不初始化new/delete构造函数初始化malloc手动算大小new不用malloc返回值是void* 要强转。new不用new失败抛异常——捕获异常malloc失败返回空NULL——判空申请自定义类型malloc/free 自动调用构造初始化和析构资源清理释放new/delete 没有
阅读完成 · 觉得有帮助?
咨询建站