c++如何使用智能指针
时间: 2023-11-27 10:04:25 浏览: 41
C++中的智能指针是一种能够自动管理指针所指向对象的生命周期的指针。使用智能指针可以避免常见的内存泄漏和空指针问题。C++11标准引入了两种智能指针:std::unique_ptr和std::shared_ptr。
std::unique_ptr是一种独占所有权的智能指针,它确保只有一个指针可以访问所指向的对象。一旦unique_ptr被销毁或者被转移,它所指向的对象也就被销毁了。使用std::unique_ptr的示例如下:
```
#include <memory>
#include <iostream>
struct MyStruct {
int data;
MyStruct(int d): data(d) { std::cout << "MyStruct(" << data << ")" << std::endl; }
~MyStruct() { std::cout << "~MyStruct(" << data << ")" << std::endl; }
};
int main() {
std::unique_ptr<MyStruct> ptr(new MyStruct(42));
std::cout << ptr->data << std::endl;
return 0;
}
```
std::shared_ptr是一种共享所有权的智能指针,它允许多个指针同时访问同一个对象。当最后一个指向该对象的shared_ptr被销毁时,该对象也会被销毁。使用std::shared_ptr的示例如下:
```
#include <memory>
#include <iostream>
struct MyStruct {
int data;
MyStruct(int d): data(d) { std::cout << "MyStruct(" << data << ")" << std::endl; }
~MyStruct() { std::cout << "~MyStruct(" << data << ")" << std::endl; }
};
int main() {
std::shared_ptr<MyStruct> ptr1(new MyStruct(42));
std::shared_ptr<MyStruct> ptr2 = ptr1;
std::cout << ptr1->data << std::endl;
std::cout << ptr2->data << std::endl;
return 0;
}
```
使用智能指针可以避免手动管理指针所指向对象的生命周期,从而减少内存泄漏和空指针问题。但是,需要注意,使用智能指针并不是万能的,仍需要根据具体情况选择合适的智能指针类型,并谨慎使用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](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)