Effective C++中文版学习记录(三)

Effective C++中文版学习记录(三)

章节三:资源管理

进度:17/55


文章目录


条款13、以对象管理资源

考虑的是如果自己写指针,有以下情况:

cpp 复制代码
void f
{
	someClass * p = someClass();
	...
	delete p;
}

看起来很合理吧,申请资源,离开作用域时释放资源,防止内存泄漏

但是假设,这个代码需要进行迭代,多人合作,导致在"..."处出现了过早的return

那么p就不会被释放,造成内存泄漏

所以更合适的方式是都写进对象中,在离开作用域时让对象自己调用析构函数

或者使用shared_ptr和auto_ptr等等

PS.这里引入了C++中的一个概念,即RAII

条款14、在资源管理类中小心copying行为

资源管理类即条款13引入的RAII类,指的是资源在构造期间获得,在析构期间释放

这种RAII类的拷贝需要将它管理的资源一起拷贝,或者使用计数器,即shared_ptr等等

讲人话就是,不要只是复制指针,要一起复制资源,防止原本的类被释放了,拷贝的指针就会受影响

cpp 复制代码
int * p1;
int * p2;
p2 = p1;
delete p1;

这种情况再使用p2就有问题了

条款15、在资源管理类中提供对原始资源的访问

简单而言就是,前文中描述RAII类能够自动管理这些资源,但是我们有时候需要直接使用这些资源,而不是通过RAII类

那么就需要RAII类来提供一个函数,能够直接返回这些资源,这个实现方法要看具体RAII类的设计方式

也就是类似于shared_ptr中的get函数,而返回资源可能需要经过一些转换,显式转换或隐式转换

尽量使用显式转换,因为比较安全

条款16、成对使用new和delete时要采取相同形式

举例

cpp 复制代码
std::string * str = new std::string[100];
...
delete str;

这样是不对的,因为这样可能只是删除了string[0]这个部分,剩下的元素都没删除

正确做法应该是

cpp 复制代码
delete [] str;

这样才能将完整的队列释放

条款17、以独立语句将newed对象置入智能指针

考虑这样一个情况

cpp 复制代码
int num();
void test(shared_ptr<int> element, int num);
...
test(shared_ptr<int>(new int), num());

这里test接收两个元素,一个是shared_ptr指针,另一个是num()函数,而我们用一行处理可能会发生错误

如果这里num()函数调用错误,会导致shared_ptr指针里面new的元素丢失掉,无法释放,造成内存泄漏

所以应该拆开来写,即

cpp 复制代码
shared_ptr<int> element(new int);
test(element, num());

也就是实现了独立语句创建智能指针,这样即便是num()函数崩了,element也还在,一样可以正常析构释放

相关推荐
TG:@yunlaoda360 云老大几秒前
腾讯云国际站代理商TACO Kit有什么优势呢?
学习·云计算·腾讯云
Ayu阿予2 分钟前
C++从源文件到可执行文件的过程
开发语言·c++
福尔摩斯张3 分钟前
基于C++的UDP网络通信系统设计与实现
linux·c语言·开发语言·网络·c++·tcp/ip·udp
不穿格子的程序员6 分钟前
从零开始写算法——链表篇2:从“回文”到“环形”——链表双指针技巧的深度解析
数据结构·算法·链表·回文链表·环形链表
hkNaruto9 分钟前
【规范】Linux平台C/C++程序版本发布调试规范手册 兼容银河麒麟
linux·c语言·c++
半夏知半秋35 分钟前
Elasticsearch Query DSL 指令整理
大数据·数据库·笔记·学习·elasticsearch·搜索引擎·全文检索
BFT白芙堂43 分钟前
Franka机械臂“举一反三”:LLM Trainer如何通过单次演示实现自动化数据生成与长程任务学习
人工智能·学习·机器学习·自动化·模型训练·具身智能·franka
诺....1 小时前
C语言不确定循环会影响输入输出缓冲区的刷新
c语言·数据结构·算法
老王熬夜敲代码1 小时前
C++中的mutex、condition_val
c++·笔记·面试