我有一个C ++项目,我已经使用C ++ / CLI成功地将.NET类包装起来。我在托管C ++中定义包装器类。我是否需要将这些类标记为__gc
才能对这些类进行垃圾回收?还是.NET框架会因为类是托管类而自动对它们进行GC?
这是当前声明的方式
public ref class Player {
我需要这样的东西吗?
__gc class Player { .. }
__gc
关键字在以前的版本中使用(IIRC,直到VS2003)。然后添加新的特定于上下文的关键字(例如ref class
,value struct
)。较新的编译器(VS2005 +)将理解并建议使用较新的关键字。上下文关键字ref class
足以表明该类是托管类。只能使用gcnew
关键字来分配托管类。编译器将引发错误new
用于托管类。对于VC ++(/clr
),堆栈语义也可用。
这意味着以下内容也有效:
public ref class SomeClass{};
void foo()
{
SomeClass cls; // On stack!
}
来自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自动调用