<tfoot id='UJn7N'></tfoot>
      <bdo id='UJn7N'></bdo><ul id='UJn7N'></ul>
    <legend id='UJn7N'><style id='UJn7N'><dir id='UJn7N'><q id='UJn7N'></q></dir></style></legend>
  1. <i id='UJn7N'><tr id='UJn7N'><dt id='UJn7N'><q id='UJn7N'><span id='UJn7N'><b id='UJn7N'><form id='UJn7N'><ins id='UJn7N'></ins><ul id='UJn7N'></ul><sub id='UJn7N'></sub></form><legend id='UJn7N'></legend><bdo id='UJn7N'><pre id='UJn7N'><center id='UJn7N'></center></pre></bdo></b><th id='UJn7N'></th></span></q></dt></tr></i><div id='UJn7N'><tfoot id='UJn7N'></tfoot><dl id='UJn7N'><fieldset id='UJn7N'></fieldset></dl></div>

    <small id='UJn7N'></small><noframes id='UJn7N'>

    1. std::shared_ptr 异常安全

      std::shared_ptr Exception Safety(std::shared_ptr 异常安全)
      <tfoot id='4ihEV'></tfoot>
        <bdo id='4ihEV'></bdo><ul id='4ihEV'></ul>

          <i id='4ihEV'><tr id='4ihEV'><dt id='4ihEV'><q id='4ihEV'><span id='4ihEV'><b id='4ihEV'><form id='4ihEV'><ins id='4ihEV'></ins><ul id='4ihEV'></ul><sub id='4ihEV'></sub></form><legend id='4ihEV'></legend><bdo id='4ihEV'><pre id='4ihEV'><center id='4ihEV'></center></pre></bdo></b><th id='4ihEV'></th></span></q></dt></tr></i><div id='4ihEV'><tfoot id='4ihEV'></tfoot><dl id='4ihEV'><fieldset id='4ihEV'></fieldset></dl></div>
            <tbody id='4ihEV'></tbody>

        • <legend id='4ihEV'><style id='4ihEV'><dir id='4ihEV'><q id='4ihEV'></q></dir></style></legend>

              <small id='4ihEV'></small><noframes id='4ihEV'>

                本文介绍了std::shared_ptr 异常安全的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我刚刚意识到阅读这个页面,std::shared_ptr 带有单个指针参数不是 noexcept.

                I just realised reading this page that the constructor of std::shared_ptr with a single pointer argument is not noexcept.

                因此以下代码可能存在内存泄漏:

                Hence the following code contains a possible memory leak:

                std::shared_ptr<int> p3 (new int);
                

                原因是可能发生两次分配:

                The reasonning is that two allocations could occure:

                • 调用构造函数之前的第一个
                • shared_ptr 构造函数中的第二个(例如 VS 2012 中发生的情况)

                这里有两个问题:

                如果第二次分配抛出异常,第一次的内存泄漏是真的吗?

                如果答案是肯定的:

                使用 std::shared_ptr 的正确习语是什么?

                • 使用 make_shared
                • 将第一次分配的所有权赋予 std::unique_ptr,然后转让所有权
                • 其他想法?

                推荐答案

                template<class Y> explicit shared_ptr(Y* p);
                

                [util.smartptr.shared.const]/6 抛出:bad_alloc,或者当资源不是无法获得内存.
                [util.smartptr.shared.const]/7 异常安全:如果抛出异常,则调用delete p.

                [util.smartptr.shared.const]/6 Throws: bad_alloc, or an implementation-defined exception when a resource other than memory could not be obtained.
                [util.smartptr.shared.const]/7 Exception safety: If an exception is thrown, delete p is called.

                所以不,没有内存泄漏.

                So no, no memory leak.

                这篇关于std::shared_ptr 异常安全的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Constructor initialization Vs assignment(构造函数初始化 Vs 赋值)
                Is a `=default` move constructor equivalent to a member-wise move constructor?(`=default` 移动构造函数是否等同于成员移动构造函数?)
                Has the new C++11 member initialization feature at declaration made initialization lists obsolete?(声明时新的 C++11 成员初始化功能是否使初始化列表过时了?)
                Order of constructor call in virtual inheritance(虚继承中构造函数调用的顺序)
                How to use sfinae for selecting constructors?(如何使用 sfinae 选择构造函数?)
                Initializing a union with a non-trivial constructor(使用非平凡的构造函数初始化联合)
                  <tbody id='wXmva'></tbody>
              1. <tfoot id='wXmva'></tfoot>
                <legend id='wXmva'><style id='wXmva'><dir id='wXmva'><q id='wXmva'></q></dir></style></legend>

                <small id='wXmva'></small><noframes id='wXmva'>

                • <i id='wXmva'><tr id='wXmva'><dt id='wXmva'><q id='wXmva'><span id='wXmva'><b id='wXmva'><form id='wXmva'><ins id='wXmva'></ins><ul id='wXmva'></ul><sub id='wXmva'></sub></form><legend id='wXmva'></legend><bdo id='wXmva'><pre id='wXmva'><center id='wXmva'></center></pre></bdo></b><th id='wXmva'></th></span></q></dt></tr></i><div id='wXmva'><tfoot id='wXmva'></tfoot><dl id='wXmva'><fieldset id='wXmva'></fieldset></dl></div>

                      • <bdo id='wXmva'></bdo><ul id='wXmva'></ul>