-1

有用 /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;
 };

当我使用此方法并且超出范围时,它应该显示“已处置”并释放内存。

 private void button1_Click(object sender, EventArgs e)
 {
        MyDll.MyClass mc= MyDll.Test();
 }

不幸的是,它没有这样做。内存仅在应用程序退出后通过执行终结器释放。如何正确释放这段内存?

4

2 回答 2

2

您可以在 C++/CLI 中使用堆栈语义来让编译器自动创建和处置对象。与原生 C++ 非常相似:

static void Test() {             
     MyClass mc;
}

请注意缺少的 ^ hat 以及返回已处置对象的需要。在您的原始代码段中,它必须由调用者明确完成:

static void RunTest() {
    MyClass^ obj = MyClass::Test();
    delete obj;
}

最后但同样重要的是,请注意,这样做根本没有意义。只有释放非托管资源时才需要析构函数和终结器。垃圾收集器已经自动释放了 MyClass 对象。不需要帮助,也不应该尝试帮助。

于 2013-10-15T12:32:45.763 回答
0

对于使用 new 或 gcnew 分配的指针,在 C++ 或 C++/cli 中没有自动删除。您必须调用 delete,或者在您的情况下(我假设“mc”在 C# 程序集中)mc.Dispose()。如果没有明确的处置,则留给 GC 来完成它。

注意:在没有调用 delete 的情况下调用 new(我在这里排除 gcnew)是内存泄漏。

于 2013-10-15T12:14:59.857 回答