.net — явный вызов управляемого деструктора из неуправляемого переполнения стека

У меня есть собственный проект 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 уничтожается только при выходе из программы. Это приводит к накоплению памяти, которая не нужна, и я получаю исключения «недостаточно памяти».

Как я могу гарантировать, что управляемые объекты разрушаются при разрушении оболочки?

2

Решение

Ты можешь использовать auto_gcroot<T>, вместо gcroot<T>, Разница в том, что auto_gcroot<T>«s деструктор «также уничтожает принадлежащий объект».

В управляемом мире это соответствует IDisposable.Dispose() на завернутый управляемый тип, при условии, что он реализует IDisposable,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]