使用shared_ptr进行内存泄漏

时间:2010-04-29 09:02:52

标签: 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;
};

变式2:

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

      SpParameterTabelle Tabelle2;
      string Id;
};

3 个答案:

答案 0 :(得分:3)

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

例如:

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;

这里a1和a2永远不会被释放,因为它们彼此之间有指针使它们保持活着。

因此,在您的情况下,请检查SpParameterTabelle是否在ParTabSpalteData上有引用,或者是否有其他可能获得循环引用。

答案 1 :(得分:0)

请注意,将智能指针传递为const SpParameterTabelle&amp; tabelle不禁止你改变指针对象。

您是否尝试直接传递智能指针,如

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

      SpParameterTabelle Tabelle2;
      string Id;
};

答案 2 :(得分:0)

在ParameterTabelle(trace / fileout)的析构函数中输出一些内容,或在那里设置断点。真的不会被叫两次吗?

我最近将VS2005项目升级到VS2010,突然VS2010报告了boost :: lexical_cast中的内存泄漏。而不是所有这些,只是在一行中的单个模块中 - 在该文件中甚至还存在相同类型/其他类型的其他lexical_cast。

甚至本地内存状态测试都将此报告为内存泄漏(仅适用于调试模式的代码):

void run_stream_tests(std::ofstream& out)
{
#ifdef _DEBUG
  CMemoryState preState;
  preState.Checkpoint();
#endif
  {
    ...your code...
  }
#ifdef _DEBUG
  CMemoryState postState;
  postState.Checkpoint();
  CMemoryState diffState;
  if( diffState.Difference( preState, postState ) )
  {
    TRACE("Memory leaked!\n");
    preState.DumpAllObjectsSince();
  }
#endif
}

所以,这也可能是VS2010 / VS2008问题。