C++动态内存管理

1、malloc/free和new/delete之间关系和差异。

C通过malloc/free来管理动态内存,而C++通过new/delete管理动态内存。

malloc/free的使用方法与new/delete有所不同。

malloc/free:

[plain]  view plain  copy
  1. int main()  
  2. {  
  3.         int *p=(int *)malloc(sizeof(int));  
  4.           
  5.         free p;  
  6.         return 0;  
  7. }  
malloc的函数原型为 void *malloc(size_t size)

new/delete:

[plain]  view plain  copy
  1. int main()  
  2. {  
  3.          int *p=new int;  
  4.   
  5.          delete p;  
  6.          return 0;  
  7. }  
new没有函数原型,因为new和delete都是C++中的关键字

总结它们之间的关联与区别:

(1)它们都是用来管理动态内存的。

(2)new/delete,malloc/free都要成对出现,否则会造成内存泄漏的问题。

(3)malloc函数在使用时需要指定开辟空间大小,而且因为malloc函数返回值是void*,所以需要强制转换。

而new则会自己及计算空间大小,返回对应类型指针。

(4)malloc/free只负责开辟空间释放空间,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理

成员)。

(5)malloc/free是C的库函数,而new/delete是C++的关键字。

2、剖析new/delete、new[]/delete[]到底做了些什么事情。

在C++中,new/delete开辟对象空间,new[]/delete[]开辟对象数组空间。

new[]的方括号中是数组中对象的个数(N),使用new[]开辟空间时,不仅要开辟N个空间,还需要在这N个空间之前开辟4个字节的空间,

用来存放N,以此来告诉编译器要调用多少次构造函数,多少次析构函数。这4个字节非常重要。

[plain]  view plain  copy
  1. int main()  
  2. {  
  3.            int *p1=new int;          //类型  
  4.            int *p2=new int(3);     //初始化  
  5.            int *p3=new int[3]; }    //数组个数  
(1)new做了两件事:

a. 调用operator new分配空间。

b. 调用构造函数初始化对象。

(2)delete也做了两件事

a. 调用析构函数清理对象

b. 调用operator delete释放空间

(3)new[N]

a. 调用operator new分配空间。

b. 调用N次构造函数分别初始化每个对象。

(4)delete[]

a. 调用N次析构函数清理对象。(思考这里怎么N是怎么来的?)

b. 调用operator delete释放空间。

我们可以用图表示出来-------


3、实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。

通过自己编写代码实现对于对象数组的开辟空间和释放空间,代码如下:
[plain]  view plain  copy
  1. #define _CRT_SECURE_NO_WARNINGS 1  
  2. #include<iostream>  
  3. using namespace std;  
  4. class Array  
  5. {  
  6. public:  
  7.     Array(size_t size = 10)              //数组类的构造函数  
  8.         : _size(size)  
  9.         , _a(0)  
  10.     {  
  11.         cout << "Array(size_t size)" << endl;  
  12.         if (_size > 0)  
  13.         {  
  14.             _a = new int[size];  
  15.         }  
  16.     }  
  17.     ~Array()                   //析构函数  
  18.     {  
  19.         cout << "~Array()" << endl;  
  20.         if (_a)  
  21.         {  
  22.             delete[] _a;  
  23.             _a = 0;  
  24.             _size = 0;  
  25.         }  
  26.     }  
  27. #define NEW_ARRAY(PTR,TYPE,N)\                                        //利用宏开展实现new[]  
  28.     do                                         \  
  29.     {                                          \  
  30.     PTR = (TYPE*)operator new(sizeof(TYPE)*N+4); \       //调用operator new函数开辟N个TYPE类型的空间,还要另外开辟4个字节空间  
  31.     (*(int*)PTR) = N;                          \         //在开辟的4个字节空间中存放N,即对象个数  
  32.     PTR = (TYPE*)((int*)PTR + 1);              \         //将PTR指针后移到对象空间  
  33.     for (size_t i = 0; i < N; ++i)             \         //对对象数组空间调用构造函数  
  34.     new(PTR + i)TYPE;                          \  
  35.     }while (false);                            \  
  36.   
  37. #define DELETE_ARRAY(PTR,TYPE)\  
  38.     do{                                        \  
  39.     size_t N = *((int*)PTR - 1);               \          //在NEW_ARRAY中PTR指向对象数组,现在将4个字节处的值取出来赋给N  
  40.     for (size_t i = 0; i < N; ++i)             \          //调用析构函数释放空间  
  41.         PTR[i].~TYPE();                        \  
  42.     PTR = (TYPE*)((char*)PTR - 4);         \           //开辟的空间还有4个字节未释放,将PTR前移,调用operator delete释放  
  43.     operator delete(PTR);                  \  
  44.     } while (false);  
  45. private:  
  46.     int*_a;  
  47.     size_t _size;  
  48. };  
  49.   
  50. int main()  
  51. {  
  52.     Array*p1;  
  53.     NEW_ARRAY(p1, Array, 10);  
  54.   
  55.     DELETE_ARRAY(p1, Array);  
  56.     system("pause");  
  57.     return 0;  
  58. }  
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
管理员功能需求 用户管理 查看用户列表:显示所有用户基本信息 添加用户:支持输入新用户信息并保存至数据库 修改用户信息:支持选择用户并更新其信息 删除用户:支持从数据库中删除选定用户 实习报告成绩管理 查看实习报告列表:显示所有学生实习报告 批阅实习报告:支持选择报告并给出批阅意见和评分 查看实习成绩列表:显示所有学生实习成绩 录入实习成绩:支持选择学生并输入成绩 修改实习成绩:支持更新学生实习成绩 通知公告管理 发布通知公告:支持输入通知内容并发布至系统 管理通知公告:支持查看、编辑和删除已发布通知 教师功能需求 学生管理 查看所指导学生列表:显示教师负责的所有学生 查看学生实习情况:支持查看学生实习岗位、日志、报告等 实习报告批阅成绩录入 查看待批阅报告列表:显示教师待批阅的实习报告 批阅报告:支持选择报告并给出批阅意见和评分 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告 实习岗位管理 发布实习岗位:支持输入岗位信息并发布至系统 编辑实习岗位:支持更新已发布岗位信息 删除实习岗位:支持从系统中删除选定岗位 学生功能需求 个人信息管理 查看个人信息:显示学生基本信息 修改个人信息:支持更新学生信息 实习岗位查询与申请 查询实习岗位:显示所有可用实习岗位 申请实习岗位:支持选择岗位并提交申请 实习日志提交 提交实习日志:支持输入日志内容并提交至系统 查看实习日志:显示学生提交的实习日志 实习报告提交 提交实习报告:支持输入报告内容并提交至系统 查看实习报告:显示学生报告及批阅意见 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值