《Effective C++ 改善程序与设计的55个具体做法》——第三章笔记

资源管理

读这章的时候发现之前对auto_ptr的理解有误,所以找了一些书重新看了一下智能指针模板相关的知识,先把这些基本知识附上。

auto_ptr是C++98中提出的,C++11中将其摒弃,同时提出了unique_ptr和shared_ptr。三者都定义了类似指针的对象,可以将new获得的地址赋值给对象,智能指针过期后,析构函数将使用delete释放内存,无需手动释放。

要创建智能指针,需包含头文件memory:

#include <memory>

using namespace std;

auto_ptr<int> pi(new int);

所有智能指针类都有explicit构造函数,不允许隐式类型转换:

shared_ptr<double> pd;

double *p_veg = new double;

pd = p_veg;  // 不允许

pd = shared_ptr<double>(p_veg);  //允许

注意:不要用非堆内存构造智能指针!!!

赋值上的区别:策略不同

1、所有权概念,对特定对象,只能有一个指针可以拥有它,赋值操作会转让所有权(auto_ptr和unique_ptr都是这样)

2、引用计数(shared_ptr是这样)

拷贝构造也是这样。

所有权转让后,原智能指针指向的为空,再次使用会有问题。

unique_ptr直接在编译阶段就禁止p1 = p2;这种赋值,不会等到运行时崩溃;

unique_ptr允许函数返回值的赋值,因为函数返回值是个临时对象,很快被销毁,即赋值右值是临时的,编译器允许。

unique_ptr<int> p1(new int);

unique_ptr<int> p2;

p2 = p1;  //不允许

unique_ptr<int> p3;

p3 = unique_ptr<int>(new int);  // 允许,临时对象转让后被销毁

容器对象建议不使用auto_ptr,可以使用unique_ptr,因为编译时有错误告警。

auto_ptr使用的是delete,不能用于数组,shared_ptr也不能用于数组。

unique有两个版本,所以可以用于数组。


条款13:以对象管理资源

获得资源后立刻放进管理对象内,资源取得时机便是初始化时机。

管理对象运用析构函数确保资源被释放。

auto_ptr和shared_ptr在复制行为上的区别

不可用于数组分配。


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

策略:

1、禁止复制

2、对底层资源祭出引用计数法

3、复制底部资源,深度拷贝

4、转移底部资源的拥有权

复制RAII对象必须一并复制它所管理的资源,资源的复制行为决定了RAII对象的复制行为。


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

RAII不是为了封装,而是为了资源释放

对原始资源的访问可能经由显示转换或隐式转换,一般而言,显示转换比较安全,隐式转换比较方便


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

new对应delete,new[ ]对应delete[ ] 


条款17:以独立语句将new的对象置入智能指针

如果不这样,一旦发生异常,有可能导致难以察觉的资源泄露。

考虑如下代码:

processWidget( shared_ptr<Widget>( new Widget ),  priority( ) ); //有问题

编译器中,参数入栈的顺序不固定。如果先new,再执行priority(),再讲资源放入shared_ptr,如果priority中出现异常,内存泄露。

应该如下处理:

shared_ptr<Widget> pw(new Widget);

processWidget( pw,  priority( ) );


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《更有效的C语言编程与设计的35个有效方法》是一本非常实用的书籍,它总结了35个提高C语言编程和设计能力的有效方法。这本书结合实际编程经验,从不同角度介绍了如何更高效地利用C语言进行软件开发。 该书首先从代码的可读性和可维护性方面提出了一些方法。比如,合理命名变量和函数、遵循一定的代码风格、使用注释等,这些方法可以使代码更易于理解和修改,提高工作效率。 其次,该书讲解了一些关于内存管理和指针的技巧。对于C语言的开发者来说,内存管理是一个非常重要的技能。书中通过介绍如何正确使用动态内存分配函数、如何避免内存泄漏等方面来帮助读者提高内存管理的能力。 此外,该书还提供了一些提高代码质量和性能的方法。如代码复用、性能优化等。对于C语言开发者来说,写出高质量、高效率的代码是非常重要的,这本书可以帮助读者掌握一些技巧和原则。 总的来说,这本书内容丰富,通俗易懂,适合C语言的初学者和有一定基础的开发者阅读。它可以帮助读者全面提高C语言编程和设计的能力,提升工作效率。无论是想从事C语言开发还是提升编程技能的人,都可以从中受益匪浅。 ### 回答2: 《more effective c: 35个改善编程与设计的有效方法(中文版) 》是一本非常实用的书籍,它提供了许多改善编程与设计的有效方法。以下是对该书的回答: 这本书共包含了35个方法,旨在帮助读者提高编程和设计的效率。它首先介绍了良好的编程风格和规范,包括命名规则、代码布局、注释等。这些方法可以使代码更易于阅读和维护,并提高代码的可重用性和可扩展性。 接下来,该书介绍了一些常见的编程错误和陷阱,并提供了相应的解决方案。例如,它说明了内存管理的重要性,并给出了避免内存泄漏和悬挂指针的方法。 此外,该书还介绍了一些高级的编程技术和设计模式,如多线程编程、异常处理和继承等。这些方法可以帮助读者编写更健壮和可靠的程序,并提高程序的性能和响应能力。 另外,该书还强调了测试和调试的重要性,并介绍了一些常用的测试工具和技术。它提供了一些测试和调试的实用方法,帮助读者发现和修复程序中的错误和缺陷。 总的来说,《more effective c: 35个改善编程与设计的有效方法(中文版) 》是一本非常实用的书籍,它提供了许多实用的方法和技巧,帮助读者提高编程和设计的效率。无论是初学者还是有经验的开发者,都可以从中受益,并提升自己的编程能力。 ### 回答3: 《more effective c :35个改善编程与设计的有效方法(中文版) .pdf》是一本关于优化编程和设计的有效方法的书籍。 这本书共包含了35个有效的方法,可以帮助程序员和设计师改进他们的工作。在这本书中,作者提供了一些实用的技巧和经验,帮助读者提高他们的编程和设计技能。 这本书的价值在于它提供了实用的方法和步骤,读者可以按照这些方法和步骤进行实施,从而实现更有效的编程和设计。这本书涵盖了多个方面,包括代码的优化、错误的处理、算法的选择、设计模式的应用等等。 通过阅读这本书,读者可以了解到如何更好地组织和管理代码,以及如何选择合适的算法和数据结构来提高程序的效率。此外,这本书还介绍了一些设计模式和原则,读者可以学习如何使用它们来提高程序的灵活性和可维护性。 总之,这本书提供了一些实用的方法和技巧,帮助读者改进他们的编程和设计技能。对于那些希望在编程和设计领域取得更好成果的人来说,这本书是一个很好的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值