《Effective Modern C++》item 21: Prefer std::make_unique and std::make_shared to direct use of new

                                                                 希望能使一个病入膏肓的人起死回生------〔古罗马〕奥维德


---直到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的话会造成类型重复出现在代码中,造成

扫描二维码关注公众号,回复: 9181426 查看本文章

代码冗余:

---建议使用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都消失后才会被释放:

发布了341 篇原创文章 · 获赞 87 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_35865125/article/details/103965670