RAII和智能指针的实现

RAII(Resource Acquisition Is Initialization)是一种C++编程技术,通过构造函数获取资源并在析构函数中释放,防止资源泄露。智能指针是RAII的典型应用,确保对象在超出作用域时自动删除,避免手动管理内存导致的问题。文章讨论了不同类型的智能指针,如autoptr、scoped_ptr、scoped_array、shared_ptr和shared_array,及其在处理内存管理中的角色。
摘要由CSDN通过智能技术生成

RAII

在C++effective一书中讲到,RAII是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。它是基于这样的原理,栈的变量会自动销毁,(自定义类型对象会调用析构函数)。它是将管理资源变为管理对象,将资源封装成类,利用构造函数来获取并初始化资源,析构函数来释放资源,从而保证资源的正确获取,初始化以及释放。从而避免了因此异常等其他措施导致资源得不到释放引起内存泄漏

RAII的应用:智能指针

RAII的常见应用可能就是智能指针了,我们知道,在C++中可以使用new,delete来申请,释放资源,然而如果出现类似如下的情况:

void fun()
{
    int* p = new int(5);

    //执行其他函数,函数抛出异常
    //other(p);

    delete p;
}

注释地方说明,可能由于某些情况,导致fun函数异常退出,这样new出来的资源得不到释放也就是内存泄漏,当然我们可以在外面try。。。catch一下,然而这会导致代码量的膨胀以及逻辑混乱。因此C++为我们提供了智能指针。不管什么原因,只要出了fun函数作用域,就会自动调用析构函数释放资源。

我们会模拟实现以下的智能指针:

//autoptr:管理权的转移(最好不要使用,比较鸡肋)

//scoped ptr:强制防拷贝(针对和指针)

//scoped array:强制防拷贝(针对数组)

//shared ptr:引用计数,通过增减计数器来管理,最后一个对象释放(针对指针)

//shared array:同上,针对数组**

#include <iostream>
//#include <string>
#include <assert.h>
using namespace std;






template<class T>
class AutoPtr //管理权限转移
{
public:
    explicit AutoPtr(T* p = nullptr)
        : _p(p)
    {}

    explicit AutoPtr(AutoPtr<T>& other)
        : _p(other._p)
    {
        other._p = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值