关于VC中^跟踪句柄的详细释义~

最早的时候VC5入门,VC6用的最顺手也用的时间最长,然后毕业了一直做JAVA,对于之后的.net平台用的少之又少。

每次拿起VC2005之后的版本,看见这个^符号时总是心生慌乱。索性今儿好好总结一些这个关于符号的释义~

这个符号是在VC2005中新加入的一个符号,为一个跟踪句柄的符号。


跟踪句柄类似于本地C++指针,但也有明显不同的地方。跟踪句柄确实存储着某个地址,如果堆压缩过程中移动了句柄引用的对象,垃圾回收器将自动更新句柄包含的地址。但是,我们不能像使用本地指针那样使用跟踪句柄执行地址的算术操作,跟踪句柄的强制类型转换也是不允许的。---<Visual C++ 2008入门经典>


总结一下也就是说:这也就是说跟踪句柄类似于一个指针,但又不同于指针,因为他不能做地址运算~

那究竟何时使用跟踪句柄呢?

在CLR堆中创建的所有对象都必须被跟踪句柄引用。所有属于引用类类型的对象都存储在堆中,因此为引用这些对象而创建的变量都必须是跟踪句柄。

总结来说也就是若想调用堆中的对象就必须使用跟踪句柄。

这也就也解释了为啥我刚才申请一个Bitmap类型使用Bitmap bt会报“error C3767: 'System::Drawing::Bitmap::Bitmap': candidate function(s) not accessible”的原因,加上这个跟踪句柄后这个问题得以解决~

但我又在想,既然为引用类型,为啥可以做如此声明呢?

Bitmap^ TileImage; //= gcnew Bitmap("test.PNG");

原来,所有跟踪句柄在初始化的时候都自动将该引用类型初始化为空。

好下面咱来试着创建一个数值类型:

  
  
  
  
  1. int^ test = 2
该语句创建了一个int^类型的句柄test,并将堆内的句柄指向的数值初始化为99.

但一定记住,这是一个指针,不能直接做类似于test2 = test+1的运算。要运算这么弄:

  
  
  
  
  1. int test_12*(*test)+7;

我今儿在想申请一个bitmap数组的时候,发现这么引用不能用。

比如Bitmap^ fieldImage[4]会提示:“ a native array cannot contain this managed type”。

这个的主要原因是CLR数组与本地的C++数组不同,我们必须使用关键字array来定义数组

于是我们定义数组如下

array<Bitmap^>^ m_tileImg;

注意,这里里外都要有^符号,因为首先Bitmap是一个引用类类型,需要^,其次因为CLR数组是在堆上创建的,所以数组变量总是一个跟踪句柄。

好啦都申请好啦,我继续写代码,一会儿有啥新发现继续更新......

继续继续,在之后申请地址的时候也应如此申请:

m_tileImg = gcnew array<Bitmap^>(4);



你可能感兴趣的:(关于VC中^跟踪句柄的详细释义~)