shared_ptr和unique_ptr区别
时间: 2023-04-29 21:03:05 浏览: 74
shared_ptr和unique_ptr是C++11中的两种智能指针,它们的主要区别在于所有权的管理方式。
shared_ptr是一种共享所有权的智能指针,多个shared_ptr可以指向同一个对象,当最后一个shared_ptr被销毁时,对象才会被释放。shared_ptr内部维护了一个引用计数器,每次创建一个新的shared_ptr时,引用计数器加1,每次销毁一个shared_ptr时,引用计数器减1,当引用计数器为时,对象被释放。
unique_ptr是一种独占所有权的智能指针,同一时间只能有一个unique_ptr指向一个对象,当unique_ptr被销毁时,对象也会被销毁。unique_ptr不能被拷贝,只能通过移动语义来转移所有权。
因此,shared_ptr适用于多个对象共享同一个资源的情况,而unique_ptr适用于独占资源的情况。
相关问题
shared_ptr 和 unique_ptr 的区别
shared_ptr 和 unique_ptr 是C++中的智能指针,用于管理动态分配的内存。它们之间的区别如下:
1. 所有权:shared_ptr 允许多个智能指针共享同一个对象,而 unique_ptr 则独占所指向的对象。当最后一个 shared_ptr 被销毁时,它所指向的对象才会被销毁;而当 unique_ptr 被销毁时,它所指向的对象立即被销毁。
2. 拷贝和赋值:shared_ptr 可以进行拷贝和赋值操作,每次拷贝会增加对象的引用计数;unique_ptr 则禁止拷贝和赋值操作,只能通过移动语义来转移所有权。
3. 内存开销:shared_ptr 需要维护一个引用计数,以跟踪对象的引用数量,从而决定何时销毁对象;unique_ptr 不需要引用计数,因此内存开销更小。
4. 空指针检查:shared_ptr 可以通过检查是否为空来判断是否指向有效对象;unique_ptr 也可以通过检查是否为空,但更常用的是使用 bool 运算符来判断是否指向有效对象。
5. 自定义删除器:shared_ptr 允许指定自定义的删除器函数,用于在对象销毁时执行特定的操作;unique_ptr 也允许指定自定义的删除器函数,但是删除器函数的类型是在编译时确定的。
下面是一个示例程序,演示了 shared_ptr 和 unique_ptr 的使用:
```cpp
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor" << std::endl;
}
};
int main() {
// 使用 shared_ptr
std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1;
// 使用 unique_ptr
std::unique_ptr<MyClass> uniquePtr1 = std::make_unique<MyClass>();
// std::unique_ptr<MyClass> uniquePtr2 = uniquePtr1; // 错误,禁止拷贝和赋值操作
return 0;
}
```
shared_ptr 和unique_ptr的区别
shared_ptr 和 unique_ptr 是 C++ 中的智能指针类型,用于管理动态分配的内存。它们之间的主要区别如下:
1. 所有权:
- shared_ptr: 允许多个 shared_ptr 指向同一个对象。它使用引用计数来跟踪对象的引用数,并在引用数为零时自动释放内存。
- unique_ptr: 只允许一个 unique_ptr 指向同一个对象。它采用独占所有权的方式管理内存,当 unique_ptr 被销毁时,它会自动释放内存。
2. 复制和移动:
- shared_ptr: 可以进行复制和移动操作。每次进行复制时,引用计数会增加;每次进行移动时,所有权会转移给新的 shared_ptr。
- unique_ptr: 不允许进行复制,但可以进行移动操作。每次进行移动时,所有权会转移给新的 unique_ptr。
3. 内存开销:
- shared_ptr: 需要额外的内存来存储引用计数,可能会导致一定的内存开销。
- unique_ptr: 不需要额外的内存开销,通常比 shared_ptr 更轻量级。
4. 适用场景:
- shared_ptr: 适用于多个拥有者共享相同资源的情况,如对象在多个地方被引用,并且需要在最后一个引用消失时释放资源。
- unique_ptr: 适用于独占所有权的情况,如对象只有一个拥有者,并且需要在该拥有者被销毁时释放资源。
总之,shared_ptr 提供了共享所有权的智能指针,而 unique_ptr 提供了独占所有权的智能指针。选择哪种类型取决于具体的需求。