shared_ptr使用示例
时间: 2023-12-06 15:36:37 浏览: 43
shared_ptr是C++11中的一个智能指针,用于管理动态分配的内存。它可以自动释放内存,避免内存泄漏和悬空指针的问题。以下是shared_ptr的使用示例:
1.使用new关键字创建shared_ptr对象
```c++
shared_ptr<Person> p1 = shared_ptr<Person>(new Person());
shared_ptr<Person> p2 = shared_ptr<Person>(new Person("Maria Wu", 23));
```
2.使用make_shared函数创建shared_ptr对象
```c++
shared_ptr<Person> p1 = make_shared<Person>();
```
在上述示例中,Person是一个自定义的类,shared_ptr<Person>是一个指向Person对象的智能指针。使用new关键字创建shared_ptr对象时,需要手动释放内存,而使用make_shared函数创建shared_ptr对象时,内存会自动释放。
相关问题
shared_ptr 代码示例
当使用 shared_ptr 时,可以通过以下示例代码来理解其用法:
```cpp
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass Constructor" << std::endl;
}
~MyClass() {
std::cout << "MyClass Destructor" << std::endl;
}
void doSomething() {
std::cout << "Doing something..." << std::endl;
}
};
int main() {
// 创建一个 shared_ptr,并自动管理 MyClass 对象的内存
std::shared_ptr<MyClass> ptr1(new MyClass());
// 使用箭头运算符访问对象的成员函数
ptr1->doSomething();
// 引用计数加1,ptr1 和 ptr2 共享同一个对象
std::shared_ptr<MyClass> ptr2 = ptr1;
// 使用星号运算符访问对象的成员函数
(*ptr2).doSomething();
// 引用计数减1
ptr1.reset();
// 引用计数为0,自动释放对象的内存
ptr2.reset();
return 0;
}
```
在这个示例中,我们创建了一个 `MyClass` 类,它具有构造函数、析构函数和一个 `doSomething` 成员函数。我们使用 `std::shared_ptr` 来管理 `MyClass` 对象的内存。
在 `main` 函数中,我们首先创建一个 `ptr1` shared_ptr,它拥有一个新创建的 `MyClass` 对象。然后,我们使用箭头运算符和星号运算符来访问 `MyClass` 对象的成员函数。
接下来,我们创建了另一个 `ptr2` shared_ptr,并将其初始化为 `ptr1`。这意味着它们共享同一个 `MyClass` 对象,并且引用计数加1。
最后,我们通过 `reset` 函数将 `ptr1` 和 `ptr2` 的引用计数减1。当引用计数为0时,`shared_ptr` 会自动释放所管理的内存,调用 `MyClass` 对象的析构函数。
在输出中,你可以观察到对象的构造函数和析构函数的调用顺序,以及引用计数的变化情况。这展示了 shared_ptr 的引用计数和自动内存管理的特性。
c shared_ptr数组示例
下面是一个示例代码,展示如何使用C++中的shared_ptr来管理动态分配的数组:
```c++
#include <iostream>
#include <memory>
int main()
{
// 创建一个指向int数组的shared_ptr
std::shared_ptr<int[]> arr(new int[5]);
// 为数组赋值
for (int i = 0; i < 5; i++) {
arr[i] = i;
}
// 输出数组的值
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 现在可以使用arr的拷贝或者赋值来传递数组
std::shared_ptr<int[]> arr2 = arr;
// 释放arr的所有权
arr.reset();
// 输出数组的值
for (int i = 0; i < 5; i++) {
std::cout << arr2[i] << " ";
}
std::cout << std::endl;
return 0;
}
```
在这个例子中,我们首先创建了一个指向int数组的shared_ptr,然后使用循环为数组赋值。接着,我们可以使用shared_ptr的拷贝或者赋值来传递这个数组。最后,我们通过调用reset()函数来释放arr的所有权,这个数组的所有权现在被arr2所持有。
相关推荐
![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)