对象作为函数的参数时,其传递过程较为复杂,传递方式比较独特。其传参过程与数组不同:数组变量的名称代表数组的首地址,而对象的变量名称却不能代表对象的首地址。传参时不会像数组那样以首地址作为函数的参数传递,而是先将对象中的所有数据进行备份(复制),将复制的数据作为形参传递到调用函数中去、
这里就详细讲讲还有堆空间的对象浅拷贝就行,其它的可以评论区讨论讨论
类对象中的数据成员的传参顺序为:最先定义的数据成员最后压栈,最后定义的数据成员最先压栈
但是当对象里面 申请堆空间的时候,使用 传参且浅拷贝,它只把堆空间地址传过去,拷贝到形参中去,


我们从地址40122C可以看出mov eax ,dword [ebp-10h],这句话的意思是把参数的值,也就是堆空间的地址作为参数直接传给形参对象,然后开辟的堆空间却是同一块地方。
注意和lea ecx , [ebp-10h]不一样,这里的ecx指的是对象的地址,并非堆空间的地址,堆空间的地址是 对象的值,这条指令执行的是把对象的地址(即this指针)作为形参传给构造函数,然后构造函数进行一系列的初始化。
这里举个例子给大家理解理解什么对象的地址,什么是堆的地址(即m_pSpring一个指针)。
假如:依据题意数据 为以下数据
(MyString的首地址)对象的地址:0x1234(此地址值存在占空间作为参数传递)
对象的值(也就是m_pSpring的地址):0x5566 (即 [ebp-10h])
(m_pSpring的地址)堆指针的地址:0x5566
(m_pSpring的值) 堆指针的值:0x4567(这里指向了所new出来的堆空间)

这里有一句m_pSpring地址并非main函数中的对象MyString的首地址
解释一下 m_pSpring地址也就是MyString的值,[ebp+8]也就是上面地址40122F所传进来的eax(调用函数push进来的第一个参数),[ebp+4]这里是上个函数的返回地址,地址4010E4这里lea ecx [ebp+8]取的是堆指针的地址,把堆指针的地址作为参数传给getString函数,然后进行操作。

这里两次释放堆空间,第一次释放是调用完ShowString函数后进行了堆的释放(也就是**(地址4010F2或者401235)代码**结束后),第二次释放是main函数(地址4010FF或者401242)代码结束后
508

被折叠的 条评论
为什么被折叠?



