C++ 新特性 三种智能指针

本文详细介绍了智能指针std::unique_ptr、std::shared_ptr和std::weak_ptr的创建方法、权限转移和案例实战,以防止内存泄漏并优化资源管理。

智能指针

准备工作

  1. 智能指针的作用是为了防止内存泄漏。

  2. 使用智能指针之前一定要包含头文件memory:

#include<memory>

std::unique_ptr

创建方法

以自定义的Person类为例。

错误创建方法:

std::unique_ptr<Person> p1 = new Person();
//因为没有assignment=的操作

正确创建方法:

//法一:
std::unique_ptr<Person> p(new Person());

//法二:
std::unique_ptr<Person> p = std::make_unique<Person>();  //模板函数

//法三:
auto p = std::make_unique<Person>();

建议使用法二或法三。

权限转移

由于智能指针unique_ptr只允许有一个指针指向一个对象。所以想让另一个指针指向某个对象,理论上需要先将之前的对象的指针指向nullptr,再让该指针指向对象。

实际操作使用到std::move函数,具体操作如下:

auto p1 = std::make_unique<Person>();
std::unique_ptr<Person> p2 = std::move(p1);  //auto p2 = std::move(p1);

权限转移经常运用到函数传参之中:

auto p = std::make_unique<Person>();
func(std::move(p));

案例说明

#include<iostream>
#include <memory>

class Person {
public:
  int age;
  Person() { puts("创建Person"); }
  ~Person() { puts("析构Person"); }
};

int main() {
  puts("开始main函数");
  {
    auto p1 = std::make_unique<Person>();
    p1->age = 10;
    auto p2 = std::move(p1);
    p2->age = 20;
    //p1->age = 30;  //错误操作,因为此时p1已经指向了nullptr
  }
  puts("结束main函数");

  system("pause");
  return 0;
}

std::shared_ptr

创建方法

法一:

std::shared_ptr<Person> p(new Person());

法二:

std::shared_ptr<Person> p = std::make_shared<Person>();

法三:

auto p = std::make_shared<Person>();

建议使用法二和法三。

拷贝指针

auto p1 = std::make_shared<Person>();
std::shared_ptr<Person> p2 = p1;  //auto p2 = p1;  //也可以

权限转移

尽管多个shared_ptr可以指向同一个对象,但是同样也可以使用std::move函数转移权限(同shared_ptr)。尽量使用move。

auto p1 = std::make_shared<Person>();
func(std::move(p1));

案例说明

#include<iostream>
#include <memory>

class Person {
public:
  int age;
  Person() { puts("创建Person"); }
  ~Person() { puts("析构Person"); }
};

void func(std::shared_ptr<Person> p) {}

int main() {
  puts("main函数开始");
  {
    auto p = std::make_shared<Person>();
    puts("进入func函数");
    func(p);
    puts("结束func函数");
  }
  puts("main函数结束");
  
  system("pause");
  return 0;
}

【说明】当指向某个对象的所有指针都结束生命周期后,该对象才会被析构。

std::weak_ptr

总结

  1. 尽量使用智能指针。

  2. 尽量使用unique_ptr。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值