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

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,简单说就是在构造函数中获得资源,在析构函数中释放资源,同时考虑使用智能指针

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值