“= gcnew MyClass()”和“= %MyClass()”有啥区别?

Posted

技术标签:

【中文标题】“= gcnew MyClass()”和“= %MyClass()”有啥区别?【英文标题】:What is the difference between "= gcnew MyClass()" and "= %MyClass()"?“= gcnew MyClass()”和“= %MyClass()”有什么区别? 【发布时间】:2019-08-17 20:29:43 【问题描述】:

有什么区别

MyClass ^myClass = gcnew MyClass();

MyClass ^myClass = %MyClass();

如果有的话?

两者似乎都有效,但不确定幕后发生了什么。

【问题讨论】:

完全不一样,第二条语句是使用“堆栈语义”的一种破坏方式。通常写为MyClass myClass;,故意省略^ 帽子。最大的不同是对象自动放置在作用域块的末尾。如果您熟悉 C++,那么它相当于 RAII。如果您熟悉 C#,那么它相当于 using 语句。开始谷歌搜索,这很重要,查询“c++/cli stack semantics”。 @HansPassant 感谢您提供更专业的见解。我试图从在线 c++-cli 文档中推断问题,但我不是专家。您的回复更有用、更准确。 @HansPassant 谢谢。在this page 上,Microsoft 表示编译器会在内部在垃圾收集堆上创建实例(使用 gcnew),但不会创建复制构造函数。所以“MyClass myClass = MyClass();”除非我实现复制构造函数,否则不起作用,但是“MyClass ^myClass = %MyClass();”确实有效...所以我想我的相关问题是...为什么? 进一步澄清上述内容:我认为“MyClass ^myClass = %MyClass();”也可以写成“MyClass mc = MyClass(); MyClass ^myClass = %mc;”但似乎并非如此。 【参考方案1】:

修订:

Stack Semantics


上一个: 因此,在这两种情况下,新创建的对象的地址都分配给了一个指针。因此,这两个语句的工作方式似乎相同。

区别: 使用gcnew 分配具有垃圾收集的托管类型(引用)的内存。

使用%MyClass() 类似于使用&MyClass(),后者没有垃圾回收功能。

gcnew: 托管类型(引用或值类型)的内存由 gcnew 分配,并通过垃圾回收器释放。

%MyClass(): 与标准 C++ 一样,该对象不会被垃圾回收。运算符重载的工作方式类似于标准 C++。每个 * 变成 ^,每个 & 变成 %。

'^'的含义: 句柄声明符(^,读作“帽子”)修改类型说明符,表示当系统确定对象不再可访问时,应自动删除声明的对象。

相关链接:Meaning of '%', Search "Operator Overloading"Meaning of gcnewMeaning of '^'

【讨论】:

以上是关于“= gcnew MyClass()”和“= %MyClass()”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

python累计求和,编写一个程序,从键盘输入两个整数m和n,求m和n之间(包括m和n)

m.2 nvme和m.2的区别是啥?

输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载

显卡后面加h和m的区别

求满足从1加到m的和大于1000的最小m值

M和N 的运算