.net 插入符号(‘;^’;)在C++/CLI?

.net 插入符号(‘;^’;)在C++/CLI?,.net,c++-cli,.net,C++ Cli,我只是偶然发现了这段代码,一些谷歌搜索没有找到对这种神秘(对我来说)语法的解释 插入符号到底是什么意思?(对我来说,gcnew也是新的,我问了这个问题。)这意味着它是对托管对象的引用。这是,插入符号是托管的*(指针)的等价物,在C++/CLI术语中,它被称为“引用类型”(因为您仍然可以有非托管指针) (由于Advar指出更好的术语).< /P> < P>这意味着这是对托管对象与常规C++指针的引用。此类引用后面的对象由运行时管理,可以在内存中重新定位。它们也是自动垃圾收集的。在C++/CLI中,

我只是偶然发现了这段代码,一些谷歌搜索没有找到对这种神秘(对我来说)语法的解释


插入符号到底是什么意思?(对我来说,
gcnew
也是新的,我问了这个问题。)

这意味着它是对托管对象的引用。

这是,插入符号是托管的*(指针)的等价物,在C++/CLI术语中,它被称为“引用类型”(因为您仍然可以有非托管指针)


(由于Advar指出更好的术语).< /P> < P>这意味着这是对托管对象与常规C++指针的引用。此类引用后面的对象由运行时管理,可以在内存中重新定位。它们也是自动垃圾收集的。

在C++/CLI中,它表示托管指针。您可以在此处阅读有关它(以及其他C++/CLI功能)的更多信息:


从MSDN看,插入符号似乎意味着您正在获得所创建类型的句柄


分配托管内存时,垃圾收集器可以移动该内存。
^
运算符是托管内存的指针,即使垃圾收集器移动它所指向的对象,它也会继续指向正确的位置

// here normal pointer
P* ptr = new P; // usual pointer allocated on heap
P& nat = *ptr; // object on heap bind to native object

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue
通常,标点符号
%
指向
^
,正如标点符号
&
指向
*
一样。在C++中,一元<代码>和>代码>运算符是C++ + CLI中的一元<代码> %<代码>运算符。
虽然
&ptr
产生了
p*
%mngd
产生于
MO^
,但也值得考虑以下两句话,它们以一种稍微不同的方式给出了答案:

句柄声明符(^,发音为“hat”)修改类型说明符,表示当系统确定对象不再可访问时,应自动删除已声明的对象

“因为本机C++指针(*)和引用(&)不是托管引用,垃圾回收器不能自动更新它们指向的地址。要解决这个问题,请使用句柄声明器指定垃圾回收器知道并可以自动更新的变量。


(和“原生”是I.M.H.O.比句柄更好的词,因为句柄可能是通过使用“Windows SDK”而带来的“

”,在C++ C++中C++(CLI+C++/CLI)中仍然存在(我想“非托管引用”)语法“是”,是常规C++的扩展,因此,是的-它仅适用于非托管引用,尽管%是C++/CLI中a引用的托管版本。顺便说一句,它是。我宁愿说为什么不使用^mngd而不是*mngd。。突然让人困惑的是,允许使用非托管指针符号(*),而不是托管堆中声明的实际变量前面的托管指针(^)。死链接(2018)修复了到archive.org copy的链接。老实说,MSDN链接非常脆弱,所有新的MSDN链接从一开始就应该通过archive.org运行。插入符号(句柄)更像是指向托管对象的指针,而不是对托管对象的引用。请参阅和/或嗯,对不起,这比我上一篇评论中的第二个链接更有用。
// here normal pointer
P* ptr = new P; // usual pointer allocated on heap
P& nat = *ptr; // object on heap bind to native object

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue