关于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_1= 2*(*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);



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值