У меня есть собственный проект 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
уничтожается только при выходе из программы. Это приводит к накоплению памяти, которая не нужна, и я получаю исключения «недостаточно памяти».
Как я могу гарантировать, что управляемые объекты разрушаются при разрушении оболочки?
Ты можешь использовать auto_gcroot<T>
, вместо gcroot<T>
, Разница в том, что auto_gcroot<T>
«s деструктор «также уничтожает принадлежащий объект».
В управляемом мире это соответствует IDisposable.Dispose()
на завернутый управляемый тип, при условии, что он реализует IDisposable
,
Других решений пока нет …