栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++中的智能指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++中的智能指针

文章目录

C++中的智能指针(Smart Pointer)

1. 介绍2. 智能指针的简单自实现3. shared_ptr

3.1 shared_ptr的原理3. 2 实例3.3 shared_ptr的循环引用 4. weak_ptr

4.1 weak_ptr解决循环引用 5. unique_ptr

C++中的智能指针(Smart Pointer) 1. 介绍

传统指针存在的问题:

需要手动管理内存;容易发生内存泄露(忘记释放、出现异常等);释放之后产生野指针。

智能指针就是为了解决传统指针存在的问题:

auto_ptr:属于C++98标准,在C++11中已经不推荐使用(有缺陷,比如不能用于数组);shared_pt:属于C++11标准;unique_prt:属于C++11标准。 2. 智能指针的简单自实现

template 
class SmartPointer {
    T *m_pointer;
 public:
    SmartPointer(T *pointer):m_pointer(pointer) { }
     ~SmartPoiner() {
          if(m_pointer == nullptr) return;
          delete m_pointer;
     }
     T *operator->() {
          return m_pointer;
     }
 };
3. shared_ptr

shared_ptr的设计理念:

多个shared_ptr可以指向同一个对象,当最后一个shared_ptr在作用域范围内结束时,对象才会被自动释放。

可以通过一个已存在的智能指针初始化一个新的智能指针:

shared_ptr p1(new Person());shared_ptr p2(p1);

针对数组的用法:

shared_ptr ptr1(new Person[5]{}, [ ] (Person *p) { delete[] p; });

shared_ptr person(new Person[5] {});

3.1 shared_ptr的原理

一个shared_ptr会对一个对象产生强引用(strong reference);

每个对象都有个与之对应的强引用计数,记录着当前对象被多少个shared_ptr强引用着;

可以通过shared_ptr的use_count函数获得强引用计数;

当有一个新的shared_ptr指向对象时,对象的强引用计数就会+1;

当有一个shared_ptr销毁时(比如作用域结束),对象的强引用计数就会-1;

当一个对象的强引用计数为0时(没有任何shared_ptr指向对象时),对象就会自动销毁(析构)。

3. 2 实例
Person *p =  new Person(); // Person()
{
    shared_ptr p1(p);
}   // ~Person()

{
    shared_ptr p2(p);
}  // ~Person()
3.3 shared_ptr的循环引用

4. weak_ptr

weak_ptr会对一个对象产生弱引用;weak_ptr可以指向对象解决shared_ptr的循环引用问题。

class Car {
public:
    weak_ptr m_person;
 };
class Person {
public:
     share_ptr m_car = nullptr;
};
share_ptr person(new Person());
share_ptr car(new Car());
person->m_car = car;
car->m_person = person;
4.1 weak_ptr解决循环引用

5. unique_ptr

unique_ptr也会对一个对象产生强引用,它可以确保同一时间只有1个指针指向对象;当``unique_ptr`销毁时(作用域结束时),其指向的对象也就自动销毁了;可以使用std::move函数转移unique_ptr的所有权;

// ptr1强引用着Person对象
unique_ptr ptr1(new Person());
// 转移之后,ptr1强引用着Person对象
unique_ptr ptr2 = std::move(ptr1);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号