资源管理:强鲁棒性应用的基石 (2)

本文探讨了C++中资源管理的重要性,特别是所有权的概念。明确了资源的所有权可以帮助确保资源正确销毁,避免资源泄漏。文章介绍了作用域、生命周期和存储持续期等关键概念,并讨论了资源转移和资源控制的区别。C++标准库通过`std::auto_ptr`和`shared_ptr`提供了资源管理支持,而自定义实现可以通过引用计数技术来实现基于值语义的资源封装类。
摘要由CSDN通过智能技术生成

3. 所有权的控制与转移

前一篇文章的资源封装实现,通过禁用资源封装类的拷贝和赋值,极大地简化了这些类的最终代码,然而同时也极大的限制了它们的使用范围。目前他们只能用在局部的资源管理以及作用常引用在作用域之间传递,这无疑是不方便的。我们要尝试去除这一限制。但是在开始之前,我们先要讨论资源的所有权问题,只有明确了资源的所有权,我们才能有效地在不同的作用域之间传递资源封装类,而不会引起混淆。因为一般的经验显示,代码实现和功能的混淆往往来源于概念的含混不清。我们先把基本的东西搞清楚。

 

对于基于值语义的POD结构体来说,C++完全继承了C的风格,保留它们的值语义,所以其中并没有太多的所有权的问题,因为一个拷贝一个结构对象自然会完全拷贝一份所有的结构成员,修改一个结构实例的成员不会对其他结构实例有任何的影响。这个实现约定极大地简化了一般代码的实现,程序员可以自由地把结构对象传来传去,就好处处理内置的基本类型一样。然而,当结构体包含足够的成员的时候,来恢赋值一个巨大的结构体的开销往往难以令人接受,程序员们开始使用指针来传递巨大的结构实例。然而,使用指针总是导致额外的复杂性,如结构体的构造和销毁的时机的选择。C++通过使用合适的封装技术以及强调所有权的概念,合理的解决了这个问题。

 

我们把所有权定义为负责最终销毁资源的权利。资源的创建和使用一般都不是问题,我们按需而动,但是资源的销毁却是至关重要的,它需要保证:

* 资源可以被销毁,没有资源泄漏

* 资源可以被及时地销毁,自动或者手动驱动

* 资源被销毁以后,不容易被误用以及重复销毁

 

对于第一个问题,我们可以确信,由于编译器可以保证对象在析构的时候一定会调用析构函数,只要把资源销毁的操作置于其中即可,而无论该对象是怎么被析构的,或者是用户直接调用delete操作符,或者该对象离开了其作用域。对于这两种情况,对象的析构函数都是保证被立即调用的,所以上述的第二条也可以得到满足;当对象析构之后,对象就不存在,任何对该对象的引用都归于无效,所以也就不能误用已经被释放的资源(倒是有可能使用引用误用被释放的对象,这是一个 C++中臭名昭著的局部对象引用问题)。这里,你应该可以理解,C代码中强烈要求(尽管不是必须)释放指针后要将指针置零,而C++却并不推荐。It's really make no sence to well designed C++ code.

 

这里,我们不止一次提到作用域,这是一个很简单,但是却十分重要的概念。我们这里复习一下。C++有多种作用域,我们这里强调其中几种。第一种是局部作用域,那就是定义在一个快࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值