Unique_ptr删除器

2023-08-14  本文已影响0人  NullUser
void mydeleter(string *pdel)
{
    delete pdel;
    pdel = nullptr;
    //可以打印日志
    cout<<"mydeleter"<<endl;
}

class CallableObject
{
  void operator()(string *pdel)
 {
    delete pdel;
    cout << "delete with callable object" << endl;
 }
};
 
void test19(){

    // a.1
    typedef void(*fp)(string *);
    unique_ptr<string, fp> ps1(new string("good luck"), mydeleter);
 
    //a.2
    using fp2 = void(*)(string *);
    unique_ptr<string, fp2> ps2(new string("good luck"), mydeleter);
 
    //a.3
    typedef decltype(mydeleter)* fp3; //decltype()返回函数类型void(string *),所以要加*,现在fp3应该是void *(string *)
    unique_ptr<string, fp3> ps3(new string("good luck"), mydeleter);
 
    //a.4
    unique_ptr<string, decltype(mydeleter)*> ps4(new string("good luck"), mydeleter);
 
    //a.5,lambda表达式,可以理解成operator()类类型对象
    auto mydella = [](string *pdel)->void{
        delete pdel;
        pdel = nullptr;
        cout<<"mydella"<<endl;
    };
    //注意,lambda表达式mydella被编译器理解成对象(即ps5的参2),所以我们类型不能加*,否则地址与对象不匹配
    //而上面的函数名mydeleter代表是首地址,需要加*地址符号进行匹配。(对象不是对象,&对象才是地址)
    unique_ptr<string, decltype(mydella)> ps5(new string("good luck"), mydella);

    //a.6 使用可调用对象
    unique_ptr<string, CallableObject> ps6(new string("good luck"), CallableObjcet());

    //a.7
    CallableObject obj;
    unique_ptr<string, CallableObject> ps7(new string("good luck"), obj);
    
    //a.8
    CallableObject *pObj = nullptr;
    unique_ptr<string, CallableObject> ps7(new string("good luck"), (*pObj));
 
}

上一篇 下一篇

猜你喜欢

热点阅读