博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++/CLI思辨录之内部指针的两面性
阅读量:7088 次
发布时间:2019-06-28

本文共 1092 字,大约阅读时间需要 3 分钟。

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


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字节的内存段位置。

本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/59846,如需转载请自行联系原作者

你可能感兴趣的文章
系统吞吐量(TPS)、用户并发量、性能测试概念和公式
查看>>
R语言笔记1--向量、数组、矩阵、数据框、列表
查看>>
大数进制转换 poj1220
查看>>
练习--LINUX进程间通信之有名管理FIFO
查看>>
使用memcached加速web应用实例
查看>>
Educational Codeforces Round 11 C. Hard Process 二分
查看>>
Android Camera 使用一例,视频聊天app
查看>>
caffe 中的一些参数介绍
查看>>
JAVA多线程和并发基础面试问答
查看>>
关于直播学习笔记-003-nginx-rtmp、srs、vlc、obs
查看>>
Memory Monitor
查看>>
[Android Pro] 由模块化到组件化(一)
查看>>
区块链代币(Token)笔记 — — 术语
查看>>
python 解析json讲解(demjson)
查看>>
Apache优化:修改最大并发连接数
查看>>
Golang--Hello World
查看>>
《火球——UML大战需求分析》(第1章 大话UML)——1.4 如何学好UML?
查看>>
某IT校招笔试
查看>>
分布式系统介绍-PNUTS
查看>>
归并分类
查看>>