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