std::shared_ptr 和 std::make_unique 的区别
时间: 2023-11-09 14:31:44 浏览: 79
`std::shared_ptr` 和 `std::make_unique` 都是 C++11 标准引入的智能指针和内存管理工具。
`std::shared_ptr` 是一种智能指针,用于共享资源的所有权。它允许多个指针共享同一个对象,直到最后一个引用计数为 0 时,对象才会被销毁。使用 `std::shared_ptr` 时,需要注意循环引用的问题,因为这可能会导致资源无法及时释放。
`std::make_unique` 是 C++14 标准引入的一个函数模板,用于创建动态分配的对象,返回一个独占的智能指针。它的优点是可以避免内存泄漏和异常安全问题,因为它会在构造函数抛出异常时自动销毁对象。同时,由于使用了 `std::unique_ptr`,也避免了循环引用的问题。
主要的区别在于,`std::shared_ptr` 可以被多个指针共享,而 `std::make_unique` 返回的是一个独占的指针。此外,`std::make_unique` 更加安全,因为它避免了内存泄漏和异常安全问题。
相关问题
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 unique
std::shared_ptr和std::unique_ptr是C++中的智能指针,用于管理动态分配的内存资源,避免手动释放内存的繁琐和容易出错的问题。
std::shared_ptr是一种共享所有权的智能指针,它允许多个指针共同拥有同一个对象。它使用引用计数的方式来跟踪对象的生命周期,当最后一个指向对象的shared_ptr被销毁时,对象会被自动删除。可以通过std::make_shared函数来创建std::shared_ptr对象。
std::unique_ptr是一种独占所有权的智能指针,它确保只有一个指针可以拥有对象。它使用移动语义来实现所有权的转移,当unique_ptr被销毁时,它所拥有的对象也会被自动删除。可以使用new关键字或std::make_unique函数来创建std::unique_ptr对象。
这两种智能指针都提供了方便的操作符重载和成员函数,可以像原始指针一样使用,同时还提供了额外的功能,如自动释放内存、自定义删除器等。
阅读全文