4

我有一个 C++ 项目,我已经使用 C++/CLI 成功地用 .NET 类包装了该项目。我在托管 C++ 中定义包装类。我是否需要将类标记为__gc以便对这些类进行垃圾收集?还是 .NET 框架会自动 GC 类,因为它们是托管类?

这就是它当前声明的方式

public ref class Player {

我需要这样的东西吗?

__gc class Player { .. }
4

2 回答 2

4

该关键字__gc用于以前的版本(IIRC,直到 VS2003)。然后添加了新的特定于上下文的关键字(如ref class, value struct)。较新的编译器(VS2005+)会理解并建议使用较新的关键字。Context 关键字ref class足以说明该类是托管类。托管类只能使用gcnew关键字分配。编译器将引发new用于托管类的错误。对于 VC++ ( /clr),堆栈语义也可用。

这意味着以下内容也是有效的:

public ref class SomeClass{};

void foo()
{
    SomeClass cls; // On stack!    
}
于 2013-03-27T06:20:12.180 回答
4

来自MSDN

类或结构上的关键字 __gc 表示它是垃圾回收的,它的生命周期由公共语言运行时管理。在用户程序中不需要显式调用删除。

但是,如果您在类内部分配内存,则需要在终结器内部使用 delete 或 free 释放它,具体取决于分配类型

public ref class PAWrapper
{
private:
    PAPor *pap;

public:

    PAWrapper()
    {
        pap = new PAPor();
    }

    ~PAWrapper(){this->!PAWrapper();}

    !PAWrapper()
    {
        delete pap;
        pap = NULL;
    }
}

所以不,你不需要__gc,但你应该定义终结器( !PAWrapper() )以避免内存泄漏。GC 会自动调用 finalizer

于 2013-03-26T08:32:12.923 回答