使用 shared_ptr 的内存泄漏

nab*_*lke 4 c++ shared-ptr

两个代码示例都可以毫无问题地编译和运行。使用第二个变体会导致内存泄漏。任何想法为什么?在此先感谢您的帮助。

变体 1:

typedef boost::shared_ptr<ParameterTabelle> SpParameterTabelle;

struct ParTabSpalteData
{
      ParTabSpalteData(const SpParameterTabelle& tabelle, const string& id)
            :Tabelle(tabelle), Id(id)
      {

      }

      const SpParameterTabelle& Tabelle;
      string Id;
};
Run Code Online (Sandbox Code Playgroud)

变体 2:

struct ParTabSpalteData
{
      ParTabSpalteData(const SpParameterTabelle& tabelle, const string& id)
            :Id(id)
      {
            // causes memory leak
            Tabelle2 = tabelle;
      }

      SpParameterTabelle Tabelle2;
      string Id;
};
Run Code Online (Sandbox Code Playgroud)

Dan*_*vil 5

您是否检查过没有循环共享指针引用?

例如:

class A {
  public: shared_ptr<A> x;
};

shared_ptr<A> a1(new A());
shared_ptr<A> a2(new A());
a1->x = a2;
a2->x = a1;
Run Code Online (Sandbox Code Playgroud)

这里 a1 和 a2 永远不会被释放,因为它们有彼此的指针,使它们保持活动状态。

因此,在您的情况下,请检查是否SpParameterTabelle有参考ParTabSpalteData或是否有另一种可能获得循环参考。  

  • 我猜的经验法则,采用智能指针的引用或指针正在颠覆所述智能指针的目的 (4认同)