分享

c 智能指针的使用

 新潮技术研究社 2023-11-02 发布于北京
智能指针是一种 C++ 对象,用于管理动态分配的内存资源。智能指针的一个主要目标是确保在任何情况下,包括异常,都能正确释放动态分配的内存,防止内存泄漏。C++ 提供了几种类型的智能指针,包括 unique_ptr、shared_ptr 和 weak_ptr。

下面是这些智能指针的基本使用方法:

1. **unique_ptr**

`unique_ptr` 代表对动态分配对象的独占所有权。当 `unique_ptr` 离开作用域或被重置时,它所拥有的对象也会被自动删除。

```cpp
std::unique_ptr<int> ptr(new int(10));
```
也可以使用 `std::make_unique` 创建 `unique_ptr`:


```cpp
std::unique_ptr<int> ptr = std::make_unique<int>(20);
```
unique_ptr` 不支持复制,但支持移动。

2. **shared_ptr**

`shared_ptr` 是一个引用计数的智能指针,用于共享所有权的场景。当最后一个引用被销毁时,`shared_ptr` 所管理的对象也会被自动删除。


```cpp
std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享同一个对象
```
`shared_ptr` 使用 `std::make_shared` 创建:


```cpp
std::shared_ptr<int> ptr = std::make_shared<int>(20);
```

3. **weak_ptr**

`weak_ptr` 是一个不控制所指向对象生存期的智能指针,它指向由 `shared_ptr` 管理的对象。其主要用途是解决循环引用的问题,例如两个对象相互引用,导致它们的生命周期无法正常结束。


```cpp
std::shared_ptr<int> ptr1(new int(10));
std::weak_ptr<int> ptr2 = ptr1; // ptr2 指向 ptr1 指向的对象,但不增加对象的引用计数
```
在 `weak_ptr` 有效期内,可以通过 `lock` 方法获取其指向的 `shared_ptr`,从而访问其管理的对象。但要注意,如果这个对象已经被销毁,`lock` 会返回一个空的 `shared_ptr`。

4. **unique_ptr 的自定义删除器**

可以为 `unique_ptr` 自定义删除器,以控制对象的删除过程。例如:


```cpp
struct FooDeleter {
    void operator()(Foo* ptr) const { delete ptr; } // 使用 delete 删除 Foo 类型的对象
};
std::unique_ptr<Foo, FooDeleter> ptr(new Foo); // 使用自定义删除器的 unique_ptr
```

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多