cpp-smartpointer
转移笔记
错误#4:没有使用make_shared来初始化shared_ptr!
相较于使用裸指针,make_share有两个独特的优点:
- 性能: 当你用new创建一个对象的同时创建一个shared_ptr时,这时会发生两次动态申请内存:一次是给使用new申请的对象本身的,而另一次则是由shared_ptr的构造函数引发的为资源管理对象分配的。
shared_ptr<aircraft> pAircraft(new Aircraft("F-16")); // Two Dynamic Memory allocations - SLOW !!! |
与此相反,当你使用make_shared的时候,C++编译器只会一次性分配一个足够大的内存,用来保存这个资源管理者和这个新建对象。
shared_ptr<aircraft> pAircraft = make_shared<aircraft>("F-16"); // Single allocation - FAST ! |
- 在看了MS编译器的memory头文件实现以后,我发现当内存分配失败时,这个对象就会被删除掉。这样的话使用裸指针初始化也不用担心安全问题了。
建议- 使用make_shared而不是裸指针来初始化共享指针。
unique_ptr
std::unique_ptr
只有一个智能指针指向对象,不能共享。
- 无法进行复制构造与赋值操作.
- 可以进行移动构造和移动赋值操作
- 可做为容器元素
// 通过原始指针创建 unique_ptr 实例 |
C++14 提供了 make_unique 来创建
auto ptr = make_unique<std::string>("senlin"); |
C++11 简单封装一下
template<typename T, typename... Ts> |
shared_ptr
使用引用还是值传递参数?
简短的答案是:没有理由使用值传递
by const reference: void foo(const shared_ptr<T>& p) |
This question has been discussed and answered by Scott, Andrei and Herb during Ask Us Anything session at C++ and Beyond 2011. Watch from 4min 34sec on shared_ptr performance and correctness.
使用 std::move
void CompilerInstance::setInvocation( |
std::shared_ptr 的引用计数是原子操作,比非原子操作耗时。
通过 move 操作,复制了原指针的引用计数,同时原指针置为空
#include <iostream> |