<bdo id='RBA0Y'></bdo><ul id='RBA0Y'></ul>

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

      1. <legend id='RBA0Y'><style id='RBA0Y'><dir id='RBA0Y'><q id='RBA0Y'></q></dir></style></legend>
      2. <tfoot id='RBA0Y'></tfoot>

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

        如何使用 shared_ptr 避免内存泄漏?

        时间:2023-06-29

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

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

                • <bdo id='h66Al'></bdo><ul id='h66Al'></ul>
                  本文介绍了如何使用 shared_ptr 避免内存泄漏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  考虑以下代码.

                  using boost::shared_ptr;
                  struct B;
                  struct A{
                      ~A() { std::cout << "~A" << std::endl; }
                      shared_ptr<B> b;    
                  };
                  struct B {
                      ~B() { std::cout << "~B" << std::endl; }
                      shared_ptr<A> a;
                  };
                  
                  int main() {
                      shared_ptr<A> a (new A);
                      shared_ptr<B> b (new B);
                      a->b = b;
                      b->a = a;
                  
                      return 0;
                  }
                  

                  没有输出.没有析构函数被调用.内存泄漏.我一直相信智能指针有助于避免内存泄漏.

                  There is no output. No desctructor is called. Memory leak. I have always believed that the smart pointer helps avoid memory leaks.

                  如果我需要在类中交叉引用怎么办?

                  What should I do if I need cross-references in the classes?

                  推荐答案

                  如果你有这样的循环引用,一个对象应该持有一个 weak_ptr 到另一个,而不是 shared_ptr.

                  If you have circular references like this, one object should hold a weak_ptr to the other, not a shared_ptr.

                  来自shared_ptr 介绍:

                  因为实现使用了引用计数,shared_ptr 实例的周期不会被回收.例如,如果 main() 持有一个 shared_ptrA,它直接或间接地持有一个 shared_ptr 回到AA 的使用次数将是 2. 原始 shared_ptr 的破坏将使 A 与使用计数为 1.使用 weak_ptr 来中断循环".

                  Because the implementation uses reference counting, cycles of shared_ptr instances will not be reclaimed. For example, if main() holds a shared_ptr to A, which directly or indirectly holds a shared_ptr back to A, A's use count will be 2. Destruction of the original shared_ptr will leave A dangling with a use count of 1. Use weak_ptr to "break cycles."

                  感谢 Glen 提供链接.

                  这篇关于如何使用 shared_ptr 避免内存泄漏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:unordered_map 线程安全 下一篇:GCC 相当于 MS 的/bigobj

                  相关文章

                    • <bdo id='WTNlz'></bdo><ul id='WTNlz'></ul>
                    <tfoot id='WTNlz'></tfoot>

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

                      <legend id='WTNlz'><style id='WTNlz'><dir id='WTNlz'><q id='WTNlz'></q></dir></style></legend>

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