何时在托管C ++类上使用__gc关键字?

时间:2013-03-26 08:26:43

标签: c++ visual-c++ compilation header c++-cli

我有一个C ++项目,我使用C ++ / CLI成功地使用.NET类包装。我在托管C ++中定义包装类。我是否需要将类标记为__gc才能对类进行垃圾回收?或者.NET框架会自动GC类,因为它们是托管类吗?

这是它当前声明的方式

public ref class Player {

我需要这样的东西吗?

__gc class Player { .. }

2 个答案:

答案 0 :(得分:4)

来自MSDN

  

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

但是,如果你在类中分配内存,你需要使用delete或free在finalizer中释放它,具体取决于分配类型

public ref class PAWrapper
{
private:
    PAPor *pap;

public:

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

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

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

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

答案 1 :(得分:2)

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

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

public ref class SomeClass{};

void foo()
{
SomeClass cls; // On stack!

}