C++/CLI思辨录之内部指针的两面性
来源:互联网 发布:美人胚子知乎 编辑:程序博客网 时间:2024/04/30 03:22
在本文中,我将解释为什么使用本地指针来管理对象。原因在于对象是以垃圾收集器移动的。所以,当对象移动时,本地指针就变成无效的。所以,如果你想取得一个托管对象的本地指针,你就会遇到一个编译错。下面的代码显示了这上点。
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字节的内存段位置。
原文转自:乐搏学院http://www.learnbo.com/
- C++/CLI思辨录之内部指针的两面性
- C++/CLI思辨录之内部指针的两面性
- C++/CLI思辨录之Object的对象布局
- C++/CLI思辨录之Object的对象布局
- C++/CLI思辨录之再谈继承
- C++/CLI思辨录之传递托管堆地址
- C++/CLI思辨录之再谈继承
- C++/CLI思辨录之代理构造函数
- C++/CLI思辨录之拷贝构造函数
- C++/CLI思辨录之拷贝构造函数
- C++/CLI(五):跟踪句柄、跟踪引用及内部指针
- WTL的两面性
- 电脑网络的两面性
- PPG成长思辨录:轻公司的光环与谜局
- 职场必杀技之思辨能力
- c++/cli之我见
- 程序员之深刻的思辨和严密的体系结构
- C++/CLI的用途
- 神经网络压缩:Mimic(二)Distilling the Knowledge in a Neural Network
- ruby on rails 的环境搭建与使用
- @张小龙 微信开机界面该升级啦!NASA帮你P了9张行星图
- gulp 的 安装使用
- 安卓常见设计模式
- C++/CLI思辨录之内部指针的两面性
- Google zxing实现二维码扫描完美解决方案
- Nginx的启动、停止与重启 php-fpm重启
- Freeline的使用
- Android--通过Monkey在手机上执行pc上的脚本文件
- mysql日志与日志分析
- .jnlp 文件打开方式
- 函数式编程介绍
- C++/CLI思辨录之Object的对象布局