对auto_ptr有研究的人进来,希望版主及在线高手关注一下

BlueDog 2009-05-13 08:46:47
以前没仔细看过auto_ptr的代码,今天仔细看了VS2003带的代码,有一个地方不是很了解,希望高手解惑

对于auto_ptr,VS2003实现了->的重载,它的具体代码如下:

_Ty *operator->() const _THROW0()
{ // return pointer to class object
return (&**this);
}


如果看汇编它是
00412033 mov ecx,dword ptr [this]
00412036 call std::auto_ptr<TEST>::operator* (411622h)

也很好理解,但是我不理解的是,为什么它不直接了当地
return _Myptr; // _Myptr 是auto_ptr的私有数据成员
这不是更简单?

各位高手可以发表一下自已的看法
...全文
154 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2009-05-14
  • 打赏
  • 举报
回复
帮顶
jameshooo 2009-05-13
  • 打赏
  • 举报
回复
*this --> auto_ptr<_Ty>&
**this --> auto_ptr<_Ty>&::operator*() --> _Ty&
&**this --> &(_Ty&) --> _Ty*

后续的VC版本已经不再采用这种实现,而是直接返回get(),而get()中直接返回_Myptr。
biweilun 2009-05-13
  • 打赏
  • 举报
回复
你OD调下看看。return (&**this);只是一种思想的表示,虽然和返回*this没什么区别
00412036 call std::auto_ptr <TEST>::operator* (411622h)
这个充其量算是个类操作函数指针的地址,你到push ebp里看看子函数撒,看完了再说
BlueDog 2009-05-13
  • 打赏
  • 举报
回复
呵呵,的确不是真正的汇编,是调试窗口里的,不过很说明问题
biweilun 2009-05-13
  • 打赏
  • 举报
回复
我晕,你看的那能算是汇编么。充其量算是个伪汇编。
wocow3 2009-05-13
  • 打赏
  • 举报
回复
把VS2003中_Ty& operator*() const _THROW0()的代码贴下

或许调用operator*()时做了一些检查
BlueDog 2009-05-13
  • 打赏
  • 举报
回复
另外,大家在验证auto_ptr是否零地址一般都如何写
是不是写成

struct TEST
{
};

auto_ptr<TEST> pint(new TEST(2));

if(pint.get())
{
}
lyserver 2009-05-13
  • 打赏
  • 举报
回复
学习,并标记。
BlueDog 2009-05-13
  • 打赏
  • 举报
回复
不错,但是对于编译后,其实不存在什么类型的,因为成员变量也只是一个偏移值
healer_kx 2009-05-13
  • 打赏
  • 举报
回复
汇编无类型,
C++是有类型的。
同样的地址,却未必是同样类型的指针哦。

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧