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

问题描述 投票:4回答:2

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

这是当前声明的方式

public ref class Player {

我需要这样的东西吗?

__gc class Player { .. }
c++ visual-c++ compilation header c++-cli
2个回答
4
投票

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

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

public ref class SomeClass{};

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

4
投票

来自MSDN

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

但是,如果您在类内部分配内存,则需要在finalizer中使用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自动调用

© www.soinside.com 2019 - 2024. All rights reserved.