type object pointer(类型对象指针)

都知道.NET是一个强对象类型的框架。

那么对于对象类型又是怎么确定的呢。

最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的)

我们知道引用对象存储在托管堆栈中,而变量本身是存储着对象的地址的。而对象的类型到底是存储在什么地方的呢。

先看一段简单的代码

private static void Gt()
        {

            dynamic dyn = (object)(new int[] { 1, 2, 3, 4, 5, 6, 7 });
            object obj = new int[] { 1, 2, 3, 4, 5, 6, 7 };

            Console.WriteLine(dyn.GetType());
            Console.WriteLine(obj.GetType());

        }

运行结果是clr都获得了数据的实际类型,并不是我定义的那样。

这个取自<CLRViaCS.第3版>,可以看到数据前面会存储着表示类型的指针

这样的描述还是很让我吃惊的,所有专门做了实验验证书中内容。

首先我们知道计算机的内存我们是可以修改的,只要在程序运行中修改这个type object pointer,是不是就可以骗过CLR让他对数据类型的判断失误呢。

按这个思路我们首先得有修改内存的工具,我这里使用的winhex,借助winhex打开当前进程的内存

找到目标数据(我这里使用的是一个string,一个int[]),疑似type object pointer我已经用红框标记出来了,现在修改这个值,winhex可以直接修改内存的2进制数据

简单的修改其中一个改成与另外一个一样后,再次获取类型,果然CLR对其的判断就错误了。

时间: 2024-10-11 04:22:34

type object pointer(类型对象指针)的相关文章

C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指针是什么,指向的什么? 从网上找也没有找到,最后往下看,书中有些描述.说下我的理解: 类型对象指针:指向类型对象存储的地址,假如有一个类型Person,它在堆中有一块区域存储它内部的字段和成员以及两个额外成员(类型对象指针. 同步块索引 ),类型对象的类型对象指针指向的是System.Type的地址

3_使用指针对象(Using Object Pointer)

类的成员函数有两种调用方式,一种是由对象调用,另一种是由对象指针调用.其中,对象调用的方式为objectName.memberFunctionName(parameters),而对象指针调用的方式为objectPointer->memberFunctionName(parameters). 对象指针调用objectPointer->memberFunctionName(parameters)等价于先将对象指针解引用,然后使用对象调用的方式调用成员函数.即(*objectPointer).mem

list对象指针与指针类型list

1 #include <string> 2 #include <cctype> 3 #include <algorithm> 4 #include <iostream> 5 #include <list> 6 using namespace std; 7 class Base{ 8 public: 9 int data; 10 Base(int y):data(y){} 11 }; 12 Base *pt(int x){ 13 Base *tmp

C# 将object类型对象(注:必须是可序列话的对象)转换为二进制序列字符串

1 public string SerializeObject(object obj) 2 { 3 //将object类型对象(注:必须是可序列化的对象)转换为二进制序列字符串 4 IFormatter formatter=new BinaryFormatter(); 5 string result=string.Empty; 6 using(MemoryStream stream=new MenmoryStream()) 7 { 8 formatter.Serialize(sream.obj)

JAVA克隆对象报错:The method clone() from the type Object is not visible

将一个对象复制一份,称为对象的克隆技术.在Object类汇总存在一个clone()方法:protected Onject clone() throws CloneNotSupportedException如果某各类的对象想被克隆,则对象所在的类必须实现Cloneable接口.此接口没有定义任何方法,是一个标记接口接下来我们看看具体代码实现:以下是正确的代码: //要实现Cloneable这个接口,不用传参 public class Dog implements Cloneable{ privat

C++:不同类型的指针的本质与差异

转自:http://blog.csdn.net/richerg85/article/details/10076365 指针的类型(The Type of a Pointer)            一个指向ZooAnimal(一个类)的指针是如何与一个指向整型的指针或者指向template Array的指针有所不同?   ZoolAnimal *px; int *pi; Array< String > *pta;        以内存需求的观点来说,没有什么不同.以上三种类型都有足够的内存来放

关于Redis五种类型对象的学习笔记

我们在使用Redis的时候,直接接触到的是字符串对象(String),列表对象(List),哈希对象(Hash),集合对象(Set),有序集合对象(SortedSet)这五种类型的对象,基本的命令如:String(get set) List(lpush rpush lpop rpop lrange) Hash(hget hset hlen hgetall) Set(sadd smembers smov) SortedSet(Zadd Zrange)等. 我们首先看一下redis对象的数据结构:

C++-对象指针的滥用

C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: 1 Object *myObject = new Object; 而不是使用: 1 myObject.testFunc(); 要不就是调用对象的方法(比如 testFunc())时不使用这种方式: 1 myObject->testFunc(); 我不明白代码为什么要写成这种形式,我能想到的是指针方式是直接访问内存,这么写代码可以提高代码效率以及执行速度,是这样的么? 最佳回复来自 Joseph Mansfield

MFC通过对话框窗口句柄获得对话框对象指针

C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由句柄得到对话框的对象指针    pWnd->xxx( );                                             //调用C***Dialog中的函数xxx(); 通过窗口类函数:CWnd *GetWindow获得窗口指针,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)