effective c++也看了好多遍了,但一直走马观花的看,不久就忘了,最近想重拾起来写点心得,
3.11
Resource Management
首先是智能指针
在c++11之前auto_ptr是智能指针的主流,满足RAII的所有要求。
RAII的概念其实也不难(下面大段抄袭概念)
RAII是C++的发明者Bjarne Stroustrup提出的概念,RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源。因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会自动调用析构函数。所以,在RAII的指导下,我们应该使用类来管理资源,将资源和对象的生命周期绑定。
简单来说就说不用因为自身疏忽忘记写delete导致大段的内存泄漏,laziness is the First Productivity。
auto_ptr有一个很致命的缺点不能让多个对象指向一个指针,这样会导致一个对象被删除多次,导致未定义行为。为了防止这种行为,auto_ptr就在复制拷贝函数动了手脚,如果原指针使用了拷贝构造函数,那么原指针就会指向NULLPTR,新指针唯一拥有资源。这造成了一定的麻烦。
C++11引入了unique_ptr作为进阶版。auto_ptr的拷贝构造函数不大符合直观感受,因此unique_ptr直接禁用了拷贝构造函数。此外auto_ptr不支持STL容器,unique支持STL容器。此外unique_ptr也支持作为函数返回值。
shared_ptr作为另一个方面的进阶版,支持一个指针指向多个对象,具体是通过引用计数法实现的,具体实现可以看网上各位大佬的代码,也就是说允许多个该智能指针共享第“拥有”同一堆分配对象的内存,这通过引用计数(reference counting)实现,会记录有多少个shared_ptr共同指向一个对象,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段.。更多是用来接循环引用的问题。
对于资源管理类很重要的一点就是如何管理其拷贝,一般采取禁止拷贝和引用计数的方法。
EffectiveC++一些心得
最新推荐文章于 2023-01-11 00:07:54 发布