2

ラッパークラスを介して.NETチャートユーティリティを利用するネイティブC++プロジェクトがあります。ラッパークラスの縮小版は次のようなものです。

class ChartWrapper
{
private:
    gcroot<ChartNamespace::ManagedChartClass^>* m_Chart;

public:
    ChartWrapper(): m_Chart(new gcroot<ChartNamespace::ManagedChartClass^>)
    {
        *m_Chart = gcnew ChartNamespace::ManagedChartClass;
    }

    ~ChartWrapper()
    {
        delete m_Chart;
    }

    // Methods to interact with the chart
}

関数は、ラッパーを介してチャートのインスタンス化、操作、および削除を処理します。

void CreateChart()
{
    ChartWrapper* chart = new ChartWrapper();
    // Do stuff to the chart
    delete chart;
}

プログラムインスタンス中に何百ものチャートを作成する可能性があります。終了時に呼び出すことで各ラッパーを明示的に削除deleteしますが、管理対象オブジェクトManagedChartClassはプログラムの終了時にのみ破棄されます。これにより、不要なメモリが蓄積され、「メモリ不足」の例外が発生します。

ラッパーが破棄されたときに管理対象オブジェクトが破棄されていることを確認するにはどうすればよいですか?

4

1 に答える 1

3

auto_gcroot<T>の代わりにを使用できますgcroot<T>。違いは、auto_gcroot<T>デストラクタが「所有オブジェクトも破壊する」ことです。

IDisposable.Dispose()マネージドワールドでは、これは、を実装している場合、ラップされたマネージドタイプの呼び出しにマップされIDisposableます。

于 2013-01-21T17:32:23.200 に答える