我有一个 C++ 项目,我已经使用 C++/CLI 成功地用 .NET 类包装了该项目。我在托管 C++ 中定义包装类。我是否需要将类标记为__gc
以便对这些类进行垃圾收集?还是 .NET 框架会自动 GC 类,因为它们是托管类?
这就是它当前声明的方式
public ref class Player {
我需要这样的东西吗?
__gc class Player { .. }
我有一个 C++ 项目,我已经使用 C++/CLI 成功地用 .NET 类包装了该项目。我在托管 C++ 中定义包装类。我是否需要将类标记为__gc
以便对这些类进行垃圾收集?还是 .NET 框架会自动 GC 类,因为它们是托管类?
这就是它当前声明的方式
public ref class Player {
我需要这样的东西吗?
__gc class Player { .. }
该关键字__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!
}
来自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