在没有gcnew的情况下创建C ++ / CLI对象

时间:2017-09-06 09:46:42

标签: c++ c++-cli clr

建议不使用gcnew创建本地C ++ / CLI对象吗? string对象str1str2的以下哪些对象是正确的还是首选的?

void foo()
{
    System::String str1("string 1");
    System::String^ str2 = gcnew System::String("string 2");

   // Do something with the strings 
}

1 个答案:

答案 0 :(得分:3)

创建不带ref class的引用类型对象(gcnew)称为stack semantics

这意味着镜像在堆栈上创建对象的简单C ++特性。它还启用RAII:如果您的对象实现IDisposable(或者如果它具有析构函数,则使用C ++ / CLI术语),当您将范围保留在声明范围时,将调用其Dispose(析构函数)方法(通常或通过异常传播)。就像一个普通的C ++析构函数一样。

在底层,即使在堆栈语义下,也会在托管堆上创建对象

因此,对RAII使用堆栈语义有明显的好处。如果您的对象不是一次性的,那么可能最终会减少混乱的代码(您使用较少^个字符并使用.代替->)但它可能会使读者感到困惑。这是你的电话。