std::shared_ptr怎么用
时间: 2024-06-17 08:03:26 浏览: 17
std::shared_ptr 是一个智能指针,用于自动管理动态分配的对象的生命周期。它通过引用计数机制来跟踪有多少个 shared_ptr 实例指向同一个对象,并在最后一个 shared_ptr 销毁时自动释放该对象。这样可以避免内存泄漏和悬空指针的问题。
使用 std::shared_ptr 的基本方法如下:
1. **直接构造**:可以使用 new 关键字动态创建一个对象,并将其地址传递给 shared_ptr 的构造函数,如 `std::shared_ptr<int> p1(new int(1));`。这样,p1 将拥有这个 int 对象的所有权。
2. **拷贝构造**:可以通过将一个 shared_ptr 赋值给另一个 shared_ptr 来共享所有权,如 `std::shared_ptr<int> p2 = p1;`。这时,p1 和 p2 都指向同一个 int 对象,并且该对象的引用计数会增加。
3. **reset**:可以使用 reset 成员函数来改变 shared_ptr 所指向的对象,如 `p3.reset(new int(1));`。如果 p3 之前已经指向了一个对象,那么该对象的引用计数会减少,如果减少到0,则该对象会被删除。
4. **make_shared**:可以使用 `std::make_shared` 工厂函数来创建一个新的 shared_ptr,这是一个推荐的方法,因为它可以更高效地分配内存,如 `std::shared_ptr<int> p4 = std::make_shared<int>(1);`。
相关问题
std::shared_ptr使用
std::shared_ptr是C++中的一种智能指针,它可以用于管理动态分配的内存资源。它能够记录多少个shared_ptr共同指向一个对象,并在引用计数变为零时自动删除对象,从而避免了手动调用delete的麻烦。
以下是std::shared_ptr的使用示例:
```cpp
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<char> sp1(new char[20]); // 创建一个shared_ptr,指向一个大小为20的字符数组
std::shared_ptr<char> sp2(new char[20], [](char* p) { delete[] p; }); // 创建一个shared_ptr,并指定自定义的删除器
std::shared_ptr<char> sp3(new char[20], std::default_delete<char[]>()); // 创建一个shared_ptr,并使用默认的删除器
// 使用shared_ptr
sp1.get()[0] = 'H';
sp1.get()[1] = 'e';
sp1.get()[2] = 'l';
sp1.get()[3] = 'l';
sp1.get()[4] = 'o';
sp1.get()[5] = '\0';
std::cout << sp1.get() << std::endl; // 输出:Hello
return 0;
}
```
在上面的示例中,我们创建了三个shared_ptr对象,分别指向大小为20的字符数组。我们可以通过调用`get()`方法获取指向的原始指针,并使用原始指针来操作内存。当所有的shared_ptr对象都不再引用该内存时,内存会被自动释放。
std::shared_ptr 使用
std::shared_ptr 是 C++11 中的一个智能指针,它可以自动管理资源的释放。使用 shared_ptr 可以避免手动释放内存,从而减少内存泄漏的风险。
shared_ptr 的使用方式如下:
1. 创建 shared_ptr 对象
```c++
std::shared_ptr<int> p1(new int(10));
```
上述代码创建了一个 int 类型的智能指针 p1,并将其指向一个动态分配的 int 类型的对象,该对象的值为 10。
2. 复制 shared_ptr 对象
```c++
std::shared_ptr<int> p2 = p1;
```
上述代码创建了一个新的智能指针 p2,并将其指向 p1 所指向的对象。此时,p1 和 p2 指向同一个对象,并且该对象的引用计数为 2。
3. 获取原始指针
```c++
int* ptr = p1.get();
```
上述代码获取了 p1 所指向的对象的原始指针。
4. 释放资源
```c++
p1.reset();
```
上述代码释放了 p1 所指向的对象,并将 p1 置为 nullptr。此时,p2 仍然指向该对象,但是该对象的引用计数为 1。
需要注意的是,当最后一个 shared_ptr 对象指向一个对象时,该对象将被自动释放。因此,在使用 shared_ptr 时,需要确保对象的生命周期不会超出智能指针的作用域。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)