2

libxml2 を使用するクラスがあります。スキーマ ファイルとそのパーサーのコンテキストを保持するために使用される静的メンバーがあります。私は valgrind を使用していますが、スキーマ コンテキストに関連してメモリの割り当てが解除されていないと不平を言っています。これは、そのメモリを自分で解放する必要があるためです。ただし、これらのコンテキスト変数は静的であるため、オブジェクトを破棄しても解放できません。必要な無料関数を呼び出す方法はありますか、それとも valgrind を無視する必要がありますか。

4

5 に答える 5

4

XML を使用するクラス内で別のクラスを宣言します。そのデストラクタで静的メンバーをクリーンアップします。ここで、外側のクラスに内側のクラス型の別の静的メンバーを与えます。自明ではないデストラクタがあるおかげで、プログラムが終了するとクリーンアップされ、他の値もクリーンアップされます。

class UseLibXml {
  static int xmlvar;

  struct StaticCleanup {
    ~StaticCleanup() {
      CleanUpLibXmlVar(UseLibXml::xmlvar);
    }
  };

  static StaticCleanup static_cleanup;
};

UseLibXml::static_cleanup.cpp ファイルの 1 つで、他の静的変数を定義するのと同じ場所を定義します。

于 2009-12-16T19:30:36.600 に答える
2

atexitハンドラーをセットアップし、そこで解放します。または無視します。

于 2009-12-16T18:45:18.330 に答える
0

メモリ リークではないので、この警告は無視してよいと思います。それらによって占有されたメモリは、アプリケーションが終了するとすぐに OS に戻ります。

于 2009-12-16T19:32:35.690 に答える
0

これらの静的変数はポインターだと思いますか?

あなたが持っていると仮定します:

class X
{
     private:
        static Plop*   staicXData;  // Initialised in the code.
};

私はそれを次のように変更します:

Class X
{
    private:
        static Plop&  getStatoc()
        {
            static Plop  data;     // Auto created on first use.
                                   // Destroyed on program exit.
            return data;
        }
};
于 2009-12-16T20:38:55.120 に答える
0

プロセスの終了時に valgrind エラーが表示される場合は、心配する必要はありません。しかし、なぜコンテキスト変数は静的なのですか?

valgrind が静的コンテキストに関連するエラーを無視するようにする抑制ファイルを生成できます。valgrind マニュアルのこのページを参照してください:エラーの抑制

于 2009-12-16T18:47:05.340 に答える