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)
本文作者:Zijian/TENG(微信公众号:好记性如烂笔头),转载请注明原文链接:https://www.cnblogs.com/tengzijian/p/17289473.html