c++ - 不使用 gcnew 创建 C++/CLI 对象

标签 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 
}

最佳答案

创建一个没有gcnew的引用类型对象(ref class)被称为stack semantics .

它的目的是镜像在堆栈上创建对象的普通 C++ 功能。它还启用 RAII:如果您的对象实现了 IDisposable(或者在 C++/CLI 术语中,如果它有析构函数),则在您离开时将调用其 Dispose(析构函数)方法声明它的范围(通常或通过异常传播)。就像调用普通的 C++ 析构函数一样。

在底层,对象是在托管堆上创建的,无论哪种情况,甚至在堆栈语义下也是如此。

因此,对 RAII 使用堆栈语义有一个明显的好处。如果您的对象不是一次性的,您可能最终会得到更少困惑的代码(您使用更少的 ^ 字符并使用 . 而不是 ->),但它可能会让读者感到困惑。这是你的决定。

关于c++ - 不使用 gcnew 创建 C++/CLI 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46071971/

相关文章:

c++ - 在 libc++ 和 glibc 中解析 double 时不一致的字符串流行为

c++ - 如何使用 C++ 限制循环中的 FPS?

c++ - Boost.Process - 从具有 sleep 循环的进程中读取

c++ - Windows 窗体 - 图片框。如何删除图像

C++ 对象被向上转换为基类;不能调用派生方法

c++ - 使用 new 运算符定义 std::shared_ptr 时出错

c# - 从 C++/CLI 使用 Web 服务

c# - 需要有关线程安全的建议

excel - 我可以在同一个 Windows 进程中拥有 CLR 的 .NET 4.0 实例和 CLR 的 .NET 3.5 实例吗?

com - 如何从 C# 等托管代码中使用 ActiveX 组件的嵌入式免注册 list ?