建议不使用gcnew
创建本地C ++ / CLI对象吗?
string
对象str1
和str2
的以下哪些对象是正确的还是首选的?
void foo()
{
System::String str1("string 1");
System::String^ str2 = gcnew System::String("string 2");
// Do something with the strings
}
答案 0 :(得分:3)
创建不带ref class
的引用类型对象(gcnew
)称为stack semantics。
这意味着镜像在堆栈上创建对象的简单C ++特性。它还启用RAII:如果您的对象实现IDisposable
(或者如果它具有析构函数,则使用C ++ / CLI术语),当您将范围保留在声明范围时,将调用其Dispose
(析构函数)方法(通常或通过异常传播)。就像一个普通的C ++析构函数一样。
在底层,即使在堆栈语义下,也会在托管堆上创建对象。
因此,对RAII使用堆栈语义有明显的好处。如果您的对象不是一次性的,那么可能最终会减少混乱的代码(您使用较少^
个字符并使用.
代替->
)但它可能会使读者感到困惑。这是你的电话。