unique_ptr的日常使用

本文详细介绍了如何使用C++中的std::unique_ptr结合自定义析构函数来管理资源,包括字符数组和自定义数据结构的释放。通过lambda表达式和函数指针作为析构器,实现资源的安全释放,避免内存泄漏。

一、对于new一个字符数组,可以在其返回指针的时候析构。

unique_ptr的第一个参数为指针数据类型,第二个参数为该指针自定义的析构器,function指示回调函数(即析构函数),然后在指针初始化时指定具体的析构函数,下面的例子中直接使用lambda表达式作为析构函数。

std::unique_ptr<char, std::function<void(char *)>> dataPtr(
        new char[maxSize], [](char *pData) {
            if (pData) {
                delete[] pData;
            }
        });

 这样或许看上去有些奇怪,那么下面的的方式会更直接:(声明一个析构器,然后直接指定)

auto delChar = [](char* pData) {
    if (pData) {
        delete[] pData;
    }
};

std::unique_ptr<char, decltype(delChar)> dataPtr;

二、对于自定义数据结构的析构,在创建该类对象的unique_ptr指针时当然也可以制定其析构函数,如下所示:

struct curl_slist *headers = NULL;
std::unique_ptr<struct curl_slist, std::function<void(struct curl_slist *)>>
            headersPtr(headers, [](struct curl_slist *pHeaders) {
                if (pHeaders != NULL) {
                    curl_slist_free_all(pHeaders);
                }
            });

 可见上面的这种方式会定义一个裸指针headers,将以个裸指针赋值作为unique_ptr的初始化参数貌似不是一个很好地选择!而且这种方式不利于代码阅读和书写。可改为以下方式:

auto delCurl_slist = [](struct curl_slist *pHeaders) {
    if (pHeaders != nullptr) {
        curl_slist_free_all(pHeaders);    //libcurl的析构函数
    }
}
std::unique_ptr<struct curl_slist, decltype(delCurl_slist)> headersPtr;

总结:实际使用unique_ptr时推荐使用第二种方式 (XD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值