动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

 C++/CLI思辨录之内部指针的两面性

作者来源: 
阅读 数 608 人次 , 2006-4-25 14:56:00 


  在本文中,我将解释为什么使用本地指针来管理对象。原因在于对象是以垃圾收集器移动的。所以,当对象移动时,本地指针就变成无效的。所以,如果你想取得一个托管对象的本地指针,你就会遇到一个编译错。下面的代码显示了这上点。

using namespace System;
int _tmain()
{
 int ^ hnd = gcnew int(100);
 int* np = &hnd; // Genarates a compile error
}

  但是本地指针还是非常有用的,如在使用指针算术和指针比较时就有许多的优点。所以新的C++ CLI允许你使用一个内部指针实现同样的功能。内部指针是本地指针的一个超集。所以它能够做任何内部指针所能做的一切。 但是当垃圾收集器移动指针所指向的对象时,内部指针也帮助程序实现其指向的地址的更新。

  现在让我们看一下如何用内部指针来实现指针算术运算。

#include "stdafx.h"
#include <stdio.h>
using namespace System;
using namespace stdcli::language;
int _tmain()
{
 const int SIZE = 10;
 array<int>^ arr = gcnew array<int>(SIZE);
 for(int idx = 0; idx < SIZE; idx++)
 {
  arr[idx] = idx + 1;
 }
 // 取得指向数组第一个元素的指针
 interior_ptr p = &arr[0];
 // 通过增加指针值读取并输出数组元素
 for(int idx = 0; idx < 10; idx++)
 {
  printf("Value of the element at %Xh ", p);
  Console::WriteLine(" is {0}",*(p++));
 }
 Console::ReadLine();
}

  不管垃圾收集器执行多少次和数组元素移动多少次,上面的代码仍然能工作良好。于是C++的力量又回到了.Net运行时刻库上。但是要小心使用内部指针。这些指针与本地指针非常相似,当试图存取不允许操作的内存区段时能给程序造成危害。例如,如果我在上面的代码中试图存取下一个p++,它将返回恰好在上面数组元素上方4字节的内存段位置。
  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:VC.NET的Direct3D极速入门宝典
· 下一篇:给WINDOWS的服务加上描述
· 通过自定义类来达到向aspx页面加入脚本代码的例子
· .NET Framework 概要
· 利用.NET框架简化发布和解决DLL Hell问题(1)
· asp+中常用的NameSpace的讲解
· Microsoft .NET Romoting 框架简介


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077