库中的内存泄漏

时间:2013-10-15 11:55:25

标签: memory c++-cli

我使用 / 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释放内存。如何正确释放这段记忆?

2 个答案:

答案 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)是内存泄漏。