2

我有一个本机 C++ 项目,它通过包装类使用 .NET 图表实用程序。包装类的精简版是这样的;

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 回答