4

どちらのコード例も問題なくコンパイルおよび実行されます。2番目のバリアントを使用すると、メモリリークが発生します。なぜ何かアイデアはありますか?助けてくれてありがとう。

バリアント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

ParameterTabelle(trace / fileout)のデストラクタに何かを出力するか、そこにブレークポイントを設定します。本当に二度呼ばれませんか?

最近、VS2005プロジェクトをVS2010にアップグレードしましたが、突然VS2010がboost::lexical_castでメモリリークを報告しました。そして、それらのすべてではなく、1行の1つのモジュールだけで-そのファイルのいたるところに同じタイプ/他のタイプの他の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

スマート ポインターを const SpParameterTabelle& tabelle として渡すことは、pointee オブジェクトの変更を禁止しないことに注意してください。

スマートポインターを直接渡そうとしましたか?

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

      SpParameterTabelle Tabelle2;
      string Id;
};
于 2010-04-29T10:04:04.343 に答える