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