智能指针
unique_ptr
初始化
访问和移动赋值
重置和移动内存资源
自定义删除器
shared_ptr
原理
自定义删除器
分配器allocator和new重载
new表达式原理
operator new delete
placement new
new (buf)
是一种 "placement new" 的使用方式,它允许在已经分配的内存上构造对象。这种方式不会分配新的内存,而是在由用户提供的内存区域上构造对象。
- 语法:
TypeName* ptr = new (buf) TypeName(arguments);
- 行为:在指针
buf
指向的内存位置上构造一个TypeName
类型的对象。这里buf
必须是指向足够大且适当对齐的内存的指针。 - 内存管理:由于内存不是由
new (buf)
分配的,因此不应该使用delete
来释放这块内存。你需要显式调用对象的析构函数来销毁对象。
allocate分配器
未初始化内存复制分析
uninitialized_copy
- 用途:
uninitialized_copy
用于在未初始化的内存中复制对象。它不仅复制数据,而且在目的地地址构造对象。这意味着它会调用每个对象的拷贝构造函数。 - 场景:当你有一块原始内存(通过
malloc
、new
或类似方式分配的内存)并且想在这块内存中创建对象的副本时,应该使用uninitialized_copy
。这常见于自定义内存管理器、优化数据结构或实现自定义容器时。 - 行为:对于每个输入元素,
uninitialized_copy
在给定位置使用拷贝构造函数构造一个新对象。
copy
- 用途:
copy
用于将元素从一个范围复制到另一个已初始化的范围。它假定目标范围已经拥有通过默认构造或以前的操作构造的对象。 - 场景:当你需要将数据从一个容器复制到另一个已经初始化(每个元素都已经构造)的容器时,应使用
copy
。 - 行为:
copy
对每个输入元素执行赋值操作,覆盖目的地范围中的现有元素。
关键区别
- 对象状态:
uninitialized_copy
针对未初始化的内存,它执行对象构造;而copy
针对已初始化的内存,执行赋值操作。 - 构造器调用:
uninitialized_copy
调用拷贝构造器,copy
调用赋值操作符。