shared_ptr 自定义 deleter 删除器

一些结论

  • 如果 shared_ptr 管理的资源不是 new 分配的内存,才考虑自定义删除器,这也是为什么 make_shared 不支持自定义删除器的原因,因为 make_shared 就是通过 new 分配内存资源
  • make_shared 不支持自定义删除器
  • shared_ptr<Bar> sp2(sp1, deleter1); 无法指定自定义删除器
    • 《C++ Primer 5th》P413 错误?
    • sp1 不能是 shared_ptr,可以是内置指针
  • reset() 参数为空或为内置指针,可以重新指定删除器
  • 顺便说一下,C++11 只有 make_shared,C++14 加入了 make_unique

测试代码

class Bar {
   public:
    Bar(int ii) : i(ii) { cout << "Bar(" << i << ")" << endl; }
    ~Bar() { cout << "~Bar(" << i << ")" << endl; }
    int i;
};

void deleter1(Bar* b) { cout << "deleter1 (" << b->i << ")" << endl; }

int main() {
    shared_ptr<Bar> sp1(new Bar(1), deleter1);
    auto sp2 = sp1;  // OK
    // shared_ptr<Bar> sp2(sp1, deleter1);  // 编译错误!
    cout << endl;
    sp1.reset(new Bar(2)); // 可以重新指定其他 deleter

    // 先析构 sp2--> Bar1 ,再析构 sp1 --> Bar2
}

运行结果

Bar(1)

Bar(2)
deleter1 (1)
~Bar(2)
posted @ 2023-04-05 15:09  Zijian/TENG  阅读(568)  评论(0编辑  收藏  举报