标签:invoke 内存分配 初始化列表 ted div strong 显示 std 空间
template <typename T, typename ...Args>
std::unique_ptr<T> make_unique(Args&& ...args) {
return unique_ptr<T>(new T(std::forward<Args>(args)...));
}
make版本不需要显示的使用new, 如果是unique就使用make_unique,如果是shared就是用make_shared;
不依赖于显式new的这种方式,在库之间依赖的时候通常减少了很多bug出现
同时减少代码的大小
对于函数 void invoke(shared_ptr
我们调用 invoke(shared_ptr
期待的顺序为
new int
shared_ptr 得到int内存
调用getMemory()
但是编译器可能调整函数上的调用顺序
new int
调用getMemory()
shared_ptr 得到int内存
如果调用getMemory出现了异常,那么 new出来的空间就内存泄漏了
修改的方式:
使用 make版本,他让 new和shared一体化
在外部使用shared_ptr,为了效率也可以使用std::move(),使用移动好处多多对吧
shared_ptr<int> test(new int());
invoke(std::move(test), getMemory());
效率
shared_ptr
如果是这样调用,造成的内存分配就是两次,一个是new,一个是内部的control block的内存分配
使用make版本代替
这样的话,make版本内部使用allocated一下子分配包含new和control block的内存大小空间,并且这样加快程序运行速度、减小内存碎片的分配
标签:invoke 内存分配 初始化列表 ted div strong 显示 std 空间
原文地址:https://www.cnblogs.com/chaohacker/p/14883727.html