C++11中引入了哪些新的智能指针类型?请描述它们的用法和区别。
C++11中引入了三种新的智能指针类型:std::unique_ptr
, std::shared_ptr
, 和 std::weak_ptr
。
std::unique_ptr
:
- 用法:
std::unique_ptr
是一种独占所有权的智能指针,即同一时间内只能有一个std::unique_ptr
指向一个给定的对象。当std::unique_ptr
被销毁时,它所指向的对象也会被自动删除。 -
例子:
“`cpp
std::unique_ptr<int> ptr(new int(10));
“`
std::shared_ptr
:
-
用法:
std::shared_ptr
是一种共享所有权的智能指针,即多个std::shared_ptr
可以同时指向同一个对象。对象的最后一个std::shared_ptr
被销毁时,该对象才会被删除。 -
例子:
“`cpp
std::shared_ptr<int> ptr1(new int(20));
std::shared_ptr<int> ptr2 = ptr1; // 现在两个shared_ptr共享同一个对象
“`
std::weak_ptr
:
-
用法:
std::weak_ptr
是一种不控制对象生命周期的智能指针,它是为了解决std::shared_ptr
相互引用导致的循环引用问题而设计的。std::weak_ptr
需要与std::shared_ptr
一起使用,它可以从一个std::shared_ptr
或另一个std::weak_ptr
创建,但它不会增加引用计数。 -
例子:
“`cpp
std::shared_ptr<int> sharedPtr(new int(30));
std::weak_ptr<int> weakPtr(sharedPtr);
“`
区别:
std::unique_ptr
用于独占所有权的场景,只能有一个指针指向对象,适用于资源管理。std::shared_ptr
用于共享所有权的场景,可以有多个指针指向同一个对象,适用于多个对象需要访问同一资源的情况。std::weak_ptr
用于辅助std::shared_ptr
,解决循环引用问题,不控制对象的生命周期。