C++之内存管理初识

内存管理

  1. 内存管理方式
    • 交互给用户管理 ----- C语言
    • GC机制,垃圾回收机制 ----- Java
  1. C++为什么没有GC机制??? ------ C++内存管理方式:计数管理+智能指针
    1. 答:
  2. 智能指针:帮助用户自动管理内存 ------ 包含头文件#include <memory>
    1. shared_ptr ---- 共智能指针
      1. 概念:允许多个共享智能指针指向同一个对象,并对指向该对象的指针计数,当计数到0时会释放该对象
      2. shared_ptr是一个类,而且是explicit,所以禁止隐式的类型转换(不可以在定义对象的时候使用“=”)
      3. 大小:裸指针的两倍
      4. 计数的增加和减少

      1. 定义一个共享指针:
      2. shared_ptr的一些常规操作:
        1. use_count():查看有多少和shared_ptr指针指向同一个对象
        2. unique():查看该智能指针是否独占某一个对象,是---> 1
        3. reset():无参时表示将该指针置为nullptr或者释放;有参时将该指针指向新的对象或者释放
        4. get():获取该指针的裸指针(兼容C语言)

        1. 指定删除器: shared_ptr指针的指向相同,则其类型就相同!!!

pt的类型为Test[ ] 所以删除的时候需要指定相同的类型

pt2类型为Test[ ],由于没有指定删除器,则pt2就被当成Test*删除,导致析构出错

        1. std::move()

// shared_ptr<Test> &&pt3 = std::move(pt2);

    1. week_ptr ---- 弱指针
      1. 定义一个week_ptr:

      1. 不会改变对象的计数引用的个数!
      2. 大小:裸指针的两倍
      3. 用来辅助shared_ptr来监视对象的生存周期。
      4. 常规操作:
        1. use_count():查看多少个shared_ptr指向该对象
        2. lock():用于转换成shared_ptr指针;
        3. reset():
        4. expired():查看弱指针是否过期
    1. unique_ptr ---- 独占指针
      1. 不支持拷贝和赋值的操作
      2. 大小和裸指针的大小相同
      3. 常规操作:
        1. release():放弃对该对象的控制权,并将其释放;
        2. reset();
        3. get():获取裸指针
        4. 指定删除器: 指向不同的对象时就是不同类型的指针

 

 


  • new operator 分配新的空间,调用operator new
  • operator new 运算符
  • 右值引用本身是一个左值,可以对其进行修改操作!!!

2、内存管理

  1. 重载new、delete、new[ ]、delete[ ]
    • 何时使用:实现内存管理,提高内存使用效率的时候
    • 重载new[ ]的时候会多出一个指针来管理分配的空间,其中就保存了需要delete的字节数
    • new、delete和构造函数、析构函数的调用顺序:
      • 先调用new,再调用构造函数
      • 先调用析构函数,在调用delete
Test *p1 = new Test(1);
delete p1;
结果:
my operator new :4      // new
Test()                  // 构造函数
~Test()                 // 析构函数   析构类对象中的成员!!!
my operator delete      // delete    删除指针


补充:析构函数的调用时机:
  1、当创建一个类的对象的时候,当该类对象离开其作用域或者程序退出的时候,系统会自动调用析构函数。
  2、当创建了一个类指针,如果用户没有delete该指针,则系统不会自动调用析构函数,只有当用户delete时会调用析构函数,顺序如上。
  1. placement new:定位new,在指定的空间(已有的内存空间)上分配内存;
static void * operator new(size_t size, void *p) //placement new
{
    printf("p = %p\n",p);
    return p;
}


int num = 5;
int * p = &num;
int * p1 = new(p1) int;
    • 作用:硬件编程,把一个地址映射成为一个对象地址,从而达到对对象的操作转化成对地址的操作。
    • Linux 进程间的通信 : 共享内存
  1. C++分配内存的两种机制:new/delete
  2. callor、malloc、realloc
    • calloc:void * calloc(int nmemb, size_t size); 分配一个内存块
    • realloc:void * realloc(void *ptr, size_t size); 在一块内存上面继续追加
  1. 内存池
    1. 实现思路:1、链表 2、嵌入式指针

具体实现:

https://blog.csdn.net/qq_40508591/article/details/107729369

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值