众所周知,C++11引入了几种智能指针。
针对智能指针,我们一起来了解一下吧~有问题可评论区一起讨论。。。。。
一、首先,引入智能指针的目的?
用来管理动态分配的内存。很多动态分配的内存由智能指针进行自动管理,这也就不需要开发人员显式的再delete,防止内存泄漏。
二、有哪几种智能指针?
C++中引入了三种主要的智能指针,它们分别是std::shared_ptr
、std::unique_ptr
和std::weak_ptr
。
以下是它们的具体介绍:
-
std::shared_ptr
:- 共享所有权的智能指针,多个
std::shared_ptr
可以同时拥有同一块内存资源。 - 通过引用计数来管理内存资源的生命周期。
- 可以通过
std::make_shared
来创建std::shared_ptr
对象。 - 可以通过
std::shared_ptr
的复制构造函数来实现拷贝。 - 当引用计数为0时,资源被自动释放。
- 共享所有权的智能指针,多个
-
std::unique_ptr
:- 独占所有权的智能指针,每个
std::unique_ptr
只能拥有一块内存资源。 - 通过移动语义来管理内存资源的所有权。
- 不能进行拷贝,但可以通过移动进行所有权转移。
- 当
std::unique_ptr
超出作用域时,资源会被自动释放。
- 独占所有权的智能指针,每个
-
std::weak_ptr
:- 弱引用的智能指针,它不会增加内存资源的引用计数。
- 用于解决
std::shared_ptr
的循环引用问题。 - 可以通过
std::weak_ptr
的lock()
方法将其转换为std::shared_ptr
来访问资源。 - 当
std::shared_ptr
释放资源后,对应的std::weak_ptr
会自动失效。
通过这三种智能指针,C++提供了不同的所有权管理方式,使得内存的动态分配和释放更加方便和安全。开发者可以根据实际的需求和情况选择使用适合的智能指针。
三、智能指针的各自用法?
-
std::shared_ptr
是一种共享所有权的智能指针。多个std::shared_ptr
对象可以共享对同一块内存的所有权。它适用于需要多个对象共同拥有同一资源的情况。可以使用std::make_shared
函数来创建std::shared_ptr
对象。示例:
// 创建一个 shared_ptr std::shared_ptr<int> sharedPtr = std::make_shared<int>(10); // 使用 shared_ptr std::cout << *sharedPtr << std::endl;
-
std::unique_ptr
是一种独占所有权的智能指针。它只能有一个指针拥有对特定资源的所有权,因此不可以拷贝,只可以移动。它适用于需要独占某个资源并在生命周期结束后自动释放的情况。示例:
// 创建一个 unique_ptr std::unique_ptr<int> uniquePtr = std::make_unique<int>(5); // 使用 unique_ptr std::cout << *uniquePtr << std::endl;
-
std::weak_ptr
是一种弱引用的智能指针,它不会增加资源的引用计数。主要用于解决std::shared_ptr
的循环引用问题。可以通过调用std::weak_ptr
的lock()
方法,将其转换为std::shared_ptr
以访问资源。示例:
// 创建一个 shared_ptr 和 weak_ptr std::shared_ptr<int> sharedPtr = std::make_shared<int>(20); std::weak_ptr<int> weakPtr = sharedPtr; // 使用 weak_ptr if (auto shared = weakPtr.lock()) { std::cout << *shared << std::endl; } else { std::cout << "shared_ptr is expired" << std::endl; }
以上是几种智能指针的简单用法,它们都在C++中提供了更安全和方便的动态内存管理机制。根据实际情况,选择适合的智能指针可以有效避免内存泄漏和悬空指针等问题。
以上主要查问的ChatGPT,有好的见解可以在评论区附言或链接,感谢~~~~~~~ღ( ´・ᴗ・` )