从非托管c+;显式调用托管析构函数+; 我有一个本地的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 }

从非托管c+;显式调用托管析构函数+; 我有一个本地的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 },c++,.net,interop,destruction,C++,.net,Interop,Destruction,在程序实例期间,有可能创建数百个图表。当我处理完每个包装后,我通过调用delete来显式删除它,但是托管对象ManagedChartClass只有在程序退出时才会被销毁。这会导致建立不需要的内存,并且会出现“内存不足”异常 如何确保在销毁包装时销毁托管对象?您可以使用,而不是gcroot。不同之处在于,auto\gcroot“也会破坏所拥有的对象。” 在托管世界中,这映射到对包装的托管类型调用IDisposable.Dispose(),前提是它实现了IDisposable,谢谢!这解决了我们的内

在程序实例期间,有可能创建数百个图表。当我处理完每个包装后,我通过调用
delete
来显式删除它,但是托管对象
ManagedChartClass
只有在程序退出时才会被销毁。这会导致建立不需要的内存,并且会出现“内存不足”异常

如何确保在销毁包装时销毁托管对象?

您可以使用,而不是
gcroot
。不同之处在于,
auto\gcroot
“也会破坏所拥有的对象。”


在托管世界中,这映射到对包装的托管类型调用
IDisposable.Dispose()
,前提是它实现了
IDisposable

,谢谢!这解决了我们的内存问题,一切都很顺利。对于因更改此实现而绊倒的任何其他人;gcroot位于全局命名空间中,而auto_gcroot位于msclr命名空间中,因此必须使用msclr::auto_gcroot实现。那让我头痛了一阵子!!
void CreateChart()
{
    ChartWrapper* chart = new ChartWrapper();
    // Do stuff to the chart
    delete chart;
}