C++11 14 17内存管理

智能指针

unique_ptr

初始化

C++11 14 17内存管理_第1张图片

访问和移动赋值

C++11 14 17内存管理_第2张图片

重置和移动内存资源

C++11 14 17内存管理_第3张图片

自定义删除器

C++11 14 17内存管理_第4张图片

shared_ptr 

原理

C++11 14 17内存管理_第5张图片

C++11 14 17内存管理_第6张图片

自定义删除器

C++11 14 17内存管理_第7张图片

分配器allocator和new重载

new表达式原理

operator new delete

C++11 14 17内存管理_第8张图片

C++11 14 17内存管理_第9张图片

placement new

C++11 14 17内存管理_第10张图片

new (buf) 是一种 "placement new" 的使用方式,它允许在已经分配的内存上构造对象。这种方式不会分配新的内存,而是在由用户提供的内存区域上构造对象。

  • 语法TypeName* ptr = new (buf) TypeName(arguments);
  • 行为:在指针 buf 指向的内存位置上构造一个 TypeName 类型的对象。这里 buf 必须是指向足够大且适当对齐的内存的指针。
  • 内存管理:由于内存不是由 new (buf) 分配的,因此不应该使用 delete 来释放这块内存。你需要显式调用对象的析构函数来销毁对象。

C++11 14 17内存管理_第11张图片

allocate分配器

C++11 14 17内存管理_第12张图片

未初始化内存复制分析

C++11 14 17内存管理_第13张图片

uninitialized_copy

  • 用途uninitialized_copy 用于在未初始化的内存中复制对象。它不仅复制数据,而且在目的地地址构造对象。这意味着它会调用每个对象的拷贝构造函数。
  • 场景:当你有一块原始内存(通过 mallocnew 或类似方式分配的内存)并且想在这块内存中创建对象的副本时,应该使用 uninitialized_copy。这常见于自定义内存管理器、优化数据结构或实现自定义容器时。
  • 行为:对于每个输入元素,uninitialized_copy 在给定位置使用拷贝构造函数构造一个新对象。

copy

  • 用途copy 用于将元素从一个范围复制到另一个已初始化的范围。它假定目标范围已经拥有通过默认构造或以前的操作构造的对象。
  • 场景:当你需要将数据从一个容器复制到另一个已经初始化(每个元素都已经构造)的容器时,应使用 copy
  • 行为copy 对每个输入元素执行赋值操作,覆盖目的地范围中的现有元素。

关键区别

  • 对象状态uninitialized_copy 针对未初始化的内存,它执行对象构造;而 copy 针对已初始化的内存,执行赋值操作。
  • 构造器调用uninitialized_copy 调用拷贝构造器,copy 调用赋值操作符。

C++20 construct_at destroy构造销毁

C++11 14 17内存管理_第14张图片

C++指针与面向对象

只能在栈中创建对象

C++11 14 17内存管理_第15张图片

C++11 14 17内存管理_第16张图片

你可能感兴趣的:(c++,开发语言)