博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅议C /CLI的gcnew关键字(2)
阅读量:4223 次
发布时间:2019-05-26

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

成功分配后,会把返回地址放在eax中。
  2.调用gcnew方式分配

int^ rInt = gcnew int;
0000005d mov ecx,788EF9D8h
00000062 call FCFAF66C
。。。
Foo^ rFoo = gcnew Foo;
00000072 mov ecx,3B51768h
00000077 call FCFAF66C


  能够看到gcnew也是通过把一个参数放到ecx中,然后再调用一个函数来完成分配的操作,显然0x788EF9D8应该是个地址,而不可能是个数值。我们能够看到这里gcnew创建两个不同类型的变量,调用的函数地址却都是0xFCFAF66C,而存放到ecx中的两个地址就不相同。究竟这几个地址代表什么呢?
  和new相同gcnew也是把返回地址放在eax中。我们直接从内存窗口看eax指向的内存块好了。Aha,看到了没有?

  这次的eax = 0x00F73404 对应的内存块为

0x00F73404 d8 f9 8e 78 00 00 00 00 。。。

  这个不就是 mov 到 ecx中的值么?再回忆昨天写的分析Object对象布局的文章,能够肯定这个就是 MethodTable地址了,对于这个int来说,后面的4个字节对应的就是存放他的RawData,比如假如您初始化为 4 那么内存对应的就变化为 d8 f9 8e 79 04 00 00 00
  分析清楚存放到ecx中的是 MethodTable指针,我们再分析那个对应的call函数,从vm的代码能够看出,有三个全局函数用来根据MethodTable创建对象,同时MethodTable本身也提供一个成员函数Allocate(),只但是这个成员函数也是调用的下面的函数:

OBJECTREF AllocateObject( MethodTable *pMT )
OBJECTREF AllocateObjectSpecial( MethodTable *pMT )
OBJECTREF FastAllocateObject( MethodTable *pMT )
  其中AllocateObject又是调用AllocateObjectSpecial来完成工作。那么我们调用的应该就是AllocateObject或FastAllocateObject了。

  在我们的例子里面两个call的地址都相同,但是您假如写下代码 double ^ pDouble = gcnew double;这个时候的地址是多少?他和int 的相同么?

  现在我还没有仔细去研究这个地址到底对应的是该类型的MethodTable::Allocate()或是上面的这三个全局函数,假如对应MethodTable::Allocate(),那么2.0中应该有个MethodTable::FastAllocate()吧,否则应该就是对应的全局函数AllocateObject 连同FastAllocateObject了。过几天一定要抽空再好好研究一下。
  下面看对应的delete函数。

delete pInt;
000000d8 mov ecx,dword ptr [esp 18h]
000000dc call dword ptr ds:[03B51540h]
比较简单,就是传入地址,然后调用operator delete来释放类存,会调用析构函数

  对应的,释放gcnew创建的对象的代码如下:

delete rInt;
000000ac mov edx,edi
000000ae mov ecx,788F747Ch
000000b3 call FC8D20FD


  这个也相对简单,他对应vm里面的一个函数:

void CallFinalizer(Thread* FinalizerThread, Object* fobj)

  那么也就是

fobjà edx
FinalizerThread à ecx
Call CallFinalizer

  但是,请注意!!!!!!!一个类包含析构函数和不包含析构函数,他对应的delete代码是不相同的,这点能够通过汇编代码比较得到,我这里就不多说了。

转自:http://www.west.cn/info/html/chengxusheji/C-C--/20080224/9240_2.html

转载地址:http://hdemi.baihongyu.com/

你可能感兴趣的文章
51单片机:led灯闪烁10次后熄灭
查看>>
安卓:okhttp请求,获取返回数据
查看>>
安卓:股票筛选及分析系统
查看>>
Effective Java 学习笔记一 Object的方法
查看>>
使用 ctypes 进行 Python 和 C 的混合编程
查看>>
用scikit-learn学习DBSCAN聚类
查看>>
机器学习:Python实现聚类算法(三)之总结
查看>>
使用sklearn做单机特征工程
查看>>
Python 多线程技巧 用threading.Event代替time.sleep()
查看>>
工具】Cmake与gcc的关系
查看>>
struct中长度为0的数组用途与原理
查看>>
svm笔记
查看>>
C++ 继承&多态
查看>>
C++多继承的观察和7点体会(都是实用派的观点) good
查看>>
python socket编程详细介绍
查看>>
高人对libsvm的经典总结(全面至极)
查看>>
Linux下c语言多线程编程
查看>>
火狐下easyui1.3.*弹出window框定位不到中间解决把办法
查看>>
Hadoop启动报错NoClassDefFoundError: javax/activation/DataSource解决方案
查看>>
Python爬虫来啦,抓取数据导出到excel,简单明了,强大,直接贴代码
查看>>