【发布时间】:2025-12-15 18:20:12
【问题描述】:
我有一个函数并调用它:
Class1& Class2::get()
{
return *m_ptr;
}
Class1& c = m_class2->get();
m_ptr 是一个自定义智能指针,我可以在调试器中看到 m_ptr.m_p 为 0,我也可以在其运算符 T* 中看到它确实返回 0。但是 c (&c) 的地址不是 NULL,它是0x30!我在反汇编中看到的:
13059 return *m_ptr;
eaabbc7e: mov 0x8(%ebp),%eax
eaabbc81: add $0xb4,%eax
eaabbc86: mov %eax,(%esp)
eaabbc89: call 0xea9ce4c0 <operator T*>
eaabbc8e: add $0x30,%eax
13060 }
就在添加 $0x30,%eax 行之前,我可以看到 %eax 为 0,即运算符正确返回 NULL。
为什么要加 0x30 的行在这里???
【问题讨论】:
-
好吧我不知道,我不是 那个 asm 方面的大专家。
-
我不尊重它。这甚至不是我的代码,但它会检查 (&c != NULL) 和 &c != NULL 是否。
-
没有看到智能指针的解引用运算符,就无法判断这是否是预期的。无论哪种方式,您都不能取消引用空指针,即使您只是为了初始化引用。
-
你在使用多重继承吗?
标签: c++ linux pointers gcc disassembly