希望能使一个病入膏肓的人起死回生------〔古罗马〕奥维德
---直到c++14,std::make_unique函数才出现,但是用户使用c++11的话可以自己实现一个:
Let’s begin by leveling the playing field for std::make_unique and std::make_shared. std::make_shared is part of C++11, but, sadly, std::make_unique isn’t. It joined the Standard Library as of C++14. If you’re using C++11,never fear, because a basic version of std::make_unique is easy to write yourself. Here, look:
https://isocpp.org/blog/2013/04/n3656-make-unique-revision-1
https://isocpp.org/get-started
---三个智能指针相关的make函数:
---建议使用make_xx函数来构造智能指针的原因(1):使用new的话会造成类型重复出现在代码中,造成
代码冗余:
---建议使用make_xx函数来构造智能指针的原因(2):可以防止异常产生时,导致new出来的资源不能被合理地托管(memory leak),
例如,举例,processWidget( std::shared_ptr<Widget>(new Widget), computePriority()); 执行该函数时,编译器会先运算
出其入参的值,可能会出现如下的执行顺序: 先执行new widige, 再执行 computePriority(),最后执行std::shared_ptr<Widget>的
构造函数,这样的话,如果在第二部执行computePriority函数时出现异常,那么第一步中被new出来的资源就没有人托管了,导致资源泄漏, 而使用make_shared函数可以避免这个问题啦。
--使用make_shared函数可以避免这个问题:
--对于unique_ptr也是一样的道理哦:
---建议使用make_xx函数来构造智能指针的原因(3):improve efficiency, 例如,使用make函数时,一次性给分配
一个空间用来存储对象和智能指针的计数资源!
---不适合使用make_xx函数的地方(1):make函数不支持custom deleter
---不适合使用make_xx函数的地方(2):
需要先学习item7
---不适合使用make_xx函数的地方(3):有些类自定义了new ,delete操作(运算符重载吧):
--对于shared_ptr,其需要一块空间来存储引用计数,原来该空间也存储着相应的weak_ptr的个数!!
使用make_x来创建智能指针时,一次性分配一个大内存,其中存着被托管的对象以及control block(即引用计数),
但是,这块大内存直到所有相关的shared_ptr以及weak_ptr都消失后才会被释放: