C++ primer 学习笔记-智能指针自定义删除器

默认情况下,智能指针使用delete释放其管理的资源,有时候,可能要修改默认使用delete释放资源的行为。本文将列出我所知道的所有自定义删除器的方法。

shared_ptr使用删除器格式

请添加图片描述

unique_ptr 使用删除器格式

在这里插入图片描述

例子:

Connection是一个管理连接类,在释放Connection之前,我们需要调用close函数来关闭连接。观察如下代码:

class Connection {
public:
    Connection() = default;
    explicit Connection(string name) :_name(name) {
    }
    string get_name() const {
        return _name;
    }
private:
    string _name;
};

void close(Connection* connection) {
    cout << string("关闭") + connection->get_name() + "管理的连接中..." << endl;
    //关闭连接的代码
    // .....
    cout << "关闭完成。" << endl;
}

函数式删除器

// 函数式删除器
void Deleter(Connection* connection) {
    close(connection);
    delete connection;
}

使用:

 shared_ptr<Connection> sp(new Connection("shared_ptr function deleter"), Deleter);
 unique_ptr<Connection, decltype(Deleter)*> up(new Connection("unique_ptr function deleter"), Deleter);

使用可调用类

class DeleterClass {
public:
    DeleterClass() :_count(0) {}
    /**
     * 重载调用运算符。
     * 这里要定义成模板函数,才可以在unique_ptr中使用。
     */
    template <typename T>
    void operator ()(T* connection) {
        close(connection);
        delete connection;
    }
private:
    int _count;
};

使用:

shared_ptr<Connection> spDeleterClass(new Connection("shared_ptr DeleterClass"), DeleterClass());
unique_ptr<Connection, DeleterClass> upDeleterClass(new Connection("unique_ptr DeleterClass"), DeleterClass());

Lambda表达式

auto DeleterLambda = [](Connection* connection) {
    close(connection);
    delete connection;
};

使用:

shared_ptr<Connection> spDeleterLambda(new Connection("shared_ptr DeleterLambda"), DeleterLambda);
unique_ptr<Connection, decltype(DeleterLambda)> upDeleterLambda(new Connection("unique_ptr DeleterLambda"), DeleterLambda);

std::function

 std::function<void(Connection*)> deleter(Deleter);

使用:

shared_ptr<Connection> spStdfunction(new Connection("shared_ptr std function"), deleter);
unique_ptr<Connection, decltype(deleter)> upStdfunction(new Connection("unique_ptr std function"), deleter);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值