4

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

变体 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;
};
4

4 回答 4

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;

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

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

于 2010-04-29T09:20:23.807 回答
0

请注意,将智能指针作为 const SpParameterTabelle& tabelle 传递并不禁止您更改指针对象。

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

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

      SpParameterTabelle Tabelle2;
      string Id;
};
于 2010-04-29T10:04:04.343 回答
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 的问题。

于 2010-04-29T12:15:51.077 回答
0

Visual Studio 的内存泄漏检测也有可能是错误的。

于 2021-09-23T10:15:27.313 回答