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

被折叠的 条评论
为什么被折叠?



