Effective C++ 学习笔记 《十三》

探讨C++中资源管理的重要性和智能指针的应用,分析内存泄漏风险,介绍RAII思想,对比auto_ptr与shared_ptr特性。

Item 13: Use objects to manage resources.

看到这个item就明白是关于资源管理的,众所周知,内存泄漏是c++典型的一种坑,自然而然对内存泄露的避免是一个非常有意义的话题。
所以这一节的重要性尤其突出。
如题,作者给出的建议就是用对象来管理资源 书上首先给了个例子

void f()
{
	Investment *pInv = createInvestment(); // call factory
	function
 	... // use pInv delete pInv; // release object
 	delete pInv;
}

Investment* createInvestment(); // return ptr to dynamically allocated object in the Investment hierarchy;
								// the caller must delete it (parameters omitted for simplicity)

这段代码首先动态分配了一块内存,使用完之后delete,看起来好像没什么问题,但是我们不得不考虑如果代码没有执行到delete,也就是说在delete之前因为各种原因,比如异常,比如提前return等等导致这个指针的资源没有被释放掉,这意味着这段代码是存在内存泄露的风险。
其实这个问题很常见,我们常听说写C++最应该避免的就是写一堆delete,原因就在这。

解决问题的办法就是把资源放进对象中来管理,基于对象自动调用析构函数的机制就能避免。比如智能指针就是典型的例子。其实这也是著名的RAII思想,即得到资源的时候便进行初始化。因为通常我们得到某种资源的时候,就会用这个资源来初始化或者是赋值给某个对象,无论哪种都应该在获得资源的时候就把它放到管理对象中。
同时管理对象应该保证资源能被释放,一旦对象被销毁比如离开作用域,它的析构函数就应该自动被调用然后释放资源。

接着书上就提到了智能指针的例子,首先是老版的auto_ptr, 书上说到不能让多个auto_ptr指向同一个对象,否则多个auto_ptr就会多次对同一块内存进行释放。为了避免这个问题,auto_ptr用一个奇怪的性质,就是不允许共享,也就是当复制一个auto_ptr给其他auto_ptr,那么被复制的对象就会变成NULL,得到的新指针反而会得到这个对象,相当于发生了一次转移。

std::auto_ptr<Investment> // pInv1 points to the
pInv1(createInvestment()); // object returned from createInvestment
std::auto_ptr<Investment> pInv2(pInv1); // pInv2 now points to the object; pInv1 is now null
pInv1 = pInv2; // now pInv1 points to the object, and pInv2 is null

比如pInv2 被赋值之后,pInv2就指向这个对象,原先的pInv1就变成了NULL,下面的语句也会发生类似的效果。
这个现象就导致auto_ptr其实不好用,因为不支持正常的复制的话,stl容器就用不了了。

接着提到了计数型指针,其实就是shared_ptr,它满足可以多个指针引用同一对象从而解决这个问题。
另外作者强调不要用shared_ptr来保存一个数组,原因就是它只会调用delete而不是delete [ ],对于数组资源,有好用的vector和string这种,所以不需要刻意来考虑用shared_ptr管理。

作者花了很大篇幅来讲智能指针其实还是想强调通过对象来管理资源的思想。总结这一节最重要的思想还是RAII,简单说就是在构造函数中获得资源,在析构函数中释放资源,同时考虑使用智能指针

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)​ 内容概要:本文围绕动态环境下多无人机系统的协同路径规划与防撞问题展开研究,提出基于Matlab的仿真代码实现方案。研究重点在于在复杂、动态环境中实现多无人机之间的高效协同飞行与避障,涵盖路径规划算法的设计与优化,确保无人机集群在执行任务过程中能够实时规避静态障碍物与动态冲突,保障飞行安全性与任务效率。文中结合智能优化算法,构建合理的成本目标函数(如路径长度、飞行高度、威胁规避、转弯角度等),并通过Matlab平台进行算法验证与仿真分析,展示多机协同的可行性与有效性。; 适合人群:具备一定Matlab编程基础,从事无人机控制、路径规划、智能优化算法研究的科研人员及研究生。; 使用场景及目标:①应用于灾害救援、军事侦察、区域巡检等多无人机协同任务场景;②目标是掌握多无人机系统在动态环境下的路径规划与防撞机制,提升协同作业能力与自主决策水平;③通过Matlab仿真深入理解协同算法的实现逻辑与参数调优方法。; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注目标函数设计、避障策略实现与多机协同逻辑,配合仿真结果分析算法性能,进一步可尝试引入新型智能算法进行优化改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值