我使用 / clr 编译了C ++ / CLI库。
ref class MyClass
{
private:
array<int>^ d;
public:
MyClass()
{
int size=10000000;
d=gcnew array<int>(size);
for(int x=0;x<size;x++)
{
d[x]=x;
};
};
~MyClass()
{
MessageBox::Show(gcnew String(L"Disposed"));
};
protected:
!MyClass()
{
MessageBox::Show(gcnew String(L"Finalized"));
};
};
static MyClass^ Test()
{
MyClass^ mc = gcnew MyClass();
//msclr::auto_handle<MyClass^> mc = gcnew MyClass();//this shows error
//msclr::auto_handle<MyClass> mc = gcnew MyClass();//this either shows error
//due to return type of function Test()
return mc;
};
当我使用此方法并且超出范围时,它应显示“Disposed”并释放内存。
private void button1_Click(object sender, EventArgs e)
{
MyDll.MyClass mc= MyDll.Test();
}
不幸的是,它没有那样做。只有在应用程序退出后才能通过执行Finalizer释放内存。如何正确释放这段记忆?
答案 0 :(得分:2)
您可以在C ++ / CLI中使用堆栈语义来让编译器自动创建和配置对象。与本机C ++非常相似:
static void Test() {
MyClass mc;
}
请注意缺少的^帽子以及不需要返回已处置的对象。在原始代码段中,必须由调用者明确地完成:
static void RunTest() {
MyClass^ obj = MyClass::Test();
delete obj;
}
最后但同样重要的是,请注意完全没有意义。析构函数和终结器只需要释放非托管资源。垃圾收集器已经自动释放MyClass对象。没有必要帮忙,也不应该尝试帮助。
答案 1 :(得分:0)
对于使用new或gcnew分配的指针,C ++或C ++ / cli中没有自动删除。您必须调用delete,或者在您的情况下(我假设'mc'在C#程序集中)mc.Dispose()。如果没有明确的处理,则由GC完成。
注意:在没有调用delete的情况下调用new(我在此处排除gcnew)是内存泄漏。