如何重写 std::shared_ptr ,给出示例
时间: 2024-06-16 18:07:10 浏览: 14
重写 std::shared_ptr 是一种定制化的需求,通常情况下我们不建议直接重写 std::shared_ptr。但是你可以通过继承 std::shared_ptr 并重写其中的一些方法来实现自定义的行为。
下面是一个示例代码,展示了如何继承 std::shared_ptr 并重写其中的 reset() 方法:
```cpp
template<typename T>
class MySharedPtr : public std::shared_ptr<T> {
public:
using std::shared_ptr<T>::shared_ptr;
void reset() {
// 自定义的 reset() 行为
// ...
std::shared_ptr<T>::reset();
}
};
```
在这个示例中,我们定义了一个名为 MySharedPtr 的类,它继承自 std::shared_ptr。我们重写了 reset() 方法,并在其中添加了自定义的行为。在重写的方法中,你可以根据自己的需求实现特定的逻辑。
使用这个自定义的 MySharedPtr 类时,可以像使用普通的 std::shared_ptr 一样进行操作。只不过在调用 reset() 方法时,会执行我们自定义的行为。
相关问题
std::shared_ptr to std::unique_ptr
转换一个 `std::shared_ptr` 到 `std::unique_ptr` 是有可能的,但是需要注意以下几点:
1. `std::unique_ptr` 拥有对象的所有权,而 `std::shared_ptr` 则是多个所有者共享一个对象的所有权,因此在转换时需要确保 `std::shared_ptr` 的引用计数为1,否则转换后的 `std::unique_ptr` 会在析构时删除对象,导致其他 `std::shared_ptr` 失效。
2. 转换时需要指定删除器,否则会使用默认删除器,可能导致不正确的对象删除行为。
下面是一个示例代码:
```
std::shared_ptr<int> shared = std::make_shared<int>(42);
std::unique_ptr<int, std::function<void(int*)>> unique(shared.get(), [](int* ptr) { delete ptr; });
shared.release();
```
在这个示例中,我们首先创建了一个 `std::shared_ptr<int>`,然后用 `shared.get()` 获取了指向对象的指针,并将其传递给了 `std::unique_ptr<int>` 的构造函数中。同时,我们也提供了一个删除器 `std::function<void(int*)>`,用于在析构时正确删除对象。最后,我们通过 `shared.release()` 释放了 `std::shared_ptr` 对对象的所有权,此时 `std::unique_ptr` 就拥有了对象的所有权。
需要注意的是,这种转换并不是推荐的做法,因为它容易引起对象所有权的混乱和不确定性。因此,在使用 `std::unique_ptr` 和 `std::shared_ptr` 时应该遵循它们的使用规范,避免不必要的转换。
std::shared_ptr 和 std::make_shared 使用实例
当使用C++中的智能指针时,可以使用`std::shared_ptr`和`std::make_shared`来管理动态分配的内存。
下面是一个使用`std::shared_ptr`和`std::make_shared`的示例:
```cpp
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called" << std::endl;
}
};
int main() {
// 使用std::shared_ptr进行动态内存分配
std::shared_ptr<MyClass> ptr1(new MyClass); std::cout << "The use count of ptr1 is: " << ptr1.use_count() << std::endl;
{
// 使用std::make_shared进行动态内存分配
auto ptr2 = std::make_shared<MyClass>();
std::cout << "The use count of ptr2 is: " << ptr2.use_count() << std::endl;
// 将ptr2赋值给ptr3,引用计数会自动增加
std::shared_ptr<MyClass> ptr3 = ptr2;
std::cout << "The use count of ptr3 is: " << ptr3.use_count() << std::endl;
}
// 这里ptr2和ptr3超出作用域,引用计数减少
std::cout << "The use count of ptr1 is: " << ptr1.use_count() << std::endl;
return 0;
}
```
上述示例中,我们首先使用`std::shared_ptr`手动分配一个`MyClass`对象,并使用`new`关键字进行初始化。然后,我们使用`std::make_shared`来动态分配另一个`MyClass`对象,并自动进行对象的构造和内存管理。
在示例的后续部分,我们展示了智能指针的引用计数特性。当我们将一个`std::shared_ptr`赋值给另一个时,引用计数会增加。当超出作用域后,引用计数会减少。这样可以确保在没有任何对象使用该内存时,内存得到正确释放。
请注意,使用智能指针可以避免显式地调用`delete`来释放内存,从而减少了内存泄漏和悬空指针的风险。