计算机系统应用教程网站

网站首页 > 技术文章 正文

C++ unique_ptr使用自定义的deleter

btikc 2024-10-24 09:32:02 技术文章 7 ℃ 0 评论

unique_ptr默认使用 delete,delete[]来释放指针指向的空间。

有些时候,可能需要使用自定义的函数来释放空间。

比如某个sdk,create_connection()返回 Connection*,然后需要使用close_connection(Connection*)来关闭连接。

还有QT,QT的QObject通常需要调用deleteLater()来释放。

这些指针如果需要unique_ptr来管理,那就需要自定义deleter来实现。

这里使用lambda表达式和function类型来定义deleter。

void test() {
    
    unique_ptr<MyClass, function<void(MyClass*)>> p(new MyClass, [](MyClass* p) {
        cout << "My deleter" << endl;
        delete p;
        }
    );
    p->hello();
    return;

}


然后我们尝试使用一个一般的函数来定义deleter。

typedef void (*MyDeleterType)(MyClass*);

void myDeleter(MyClass* p) {
    cout << "My deleter" << endl;
    delete p;
}

void test() {
    
    unique_ptr<MyClass, MyDeleterType> p(new MyClass, myDeleter);
    p->hello();
    return;

}


这里的deleter类型也可以使用 decltype。

void myDeleter(MyClass* p) {
    cout << "My deleter" << endl;
    delete p;
}

void test() {
    
    unique_ptr<MyClass, decltype(myDeleter)*> p(new MyClass, myDeleter);
    p->hello();
    return;

}


可惜的是,make_unique()并不支持自定义的deleter。不过这一点也是合理的,毕竟make_unique会使用new来新建对象,就应该使用delete来释放对象。

而正常的使用情况,如果需要使用自定义的deleter,也不应该像我这样使用new来分配空间。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表