【问题标题】:Creating an object of public ref class using new and gcnew使用 new 和 gcnew 创建公共 ref 类的对象
【发布时间】:2018-12-06 23:53:36
【问题描述】:

我在 MyRefClass.h 中声明了一个类

public ref class MyRefClass{
....
....
};

这三个对象在何处/如何分配和管理有什么区别?

//  This is allocated in **C++/CLI**.
MyRefClass ^mrc = gcnew MyRefClass();
MyRefClass *mrc2 = new MyRefClass;

// If allocated in **C#**
MyRefClass mrc3 = new MyRefClass()

如果这个问题太愚蠢,请原谅我。我是 C# 和 C++/CLI 的新手。

【问题讨论】:

  • gcnew 和 ^ 帽子只是提醒您不再在堪萨斯州。托管对象在运行时的行为不同,这是您始终需要注意的事情。它是 not 任意的,您不能在 ref 类上使用 new 和 *。为 C++ 语言配备一个积极的垃圾收集器确实迫使他们明确说明你的想法,当你还不能下定决心时,就会发生非常糟糕的事情。一定要遵循一本像样的教程或入门书籍。

标签: c# c++-cli unmanaged managed-code


【解决方案1】:

new 的第二行是错误的,不会编译,如果它是一个非托管类,即使语法错误。您必须声明一个指针以接收 new 运算符的结果。

简而言之:

必须使用 gcnew 分配托管对象(引用类)。托管对象位于 .NET 托管堆上,由垃圾收集器释放。这样的类/对象可以很容易地在 .NET 世界中的所有语言之间共享。

非托管对象(类)必须用 new 分配。它们必须通过删除来释放。此类对象存在于正常的进程堆中。

【讨论】:

  • 感谢您的回复。我应该清楚地说明 mrc2 是在 C# 中分配的。我更新了这个问题,希望它现在更有意义。
  • 在 C++/CLI 中使用 new 进行第二次分配仍然不起作用!
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多