shared_ptr自定义delete
时间: 2023-09-16 16:08:04 浏览: 88
shared_ptr
在使用 `std::shared_ptr` 时,我们可以通过自定义删除器(deleter)来指定内存释放的方式。自定义删除器是一个可调用对象,它负责在 `shared_ptr` 的引用计数变为零时释放对象。
下面是一个例子,使用 lambda 表达式自定义删除器:
```c++
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass(int id) : m_id(id) {
std::cout << "MyClass(" << m_id << ") constructed\n";
}
~MyClass() {
std::cout << "MyClass(" << m_id << ") destructed\n";
}
void foo() {
std::cout << "MyClass(" << m_id << "): foo()\n";
}
private:
int m_id;
};
int main() {
// 自定义删除器
auto deleter = [](MyClass* p) {
std::cout << "Deleting MyClass(" << p->m_id << ") with custom deleter\n";
delete p;
};
// 使用自定义删除器创建 shared_ptr
std::shared_ptr<MyClass> p(new MyClass(1), deleter);
p->foo(); // 正常调用
// 重置 shared_ptr,会调用自定义删除器
p.reset(new MyClass(2), deleter);
return 0;
}
```
输出:
```
MyClass(1) constructed
MyClass(1): foo()
Deleting MyClass(1) with custom deleter
MyClass(2) constructed
Deleting MyClass(2) with custom deleter
```
可以看到,在 `shared_ptr` 引用计数变为零时,自定义删除器会被调用,释放对象。在本例中,自定义删除器只是简单地使用 `delete` 释放对象,但你可以根据需要来自定义删除器,以实现更灵活的内存管理方式。
阅读全文