私は関数を持っていて、それを呼び出します:
Class1& Class2::get()
{
return *m_ptr;
}
Class1& c = m_class2->get();
m_ptr はカスタム スマート ポインターであり、m_ptr.m_p が 0 であることをデバッガーで確認できます。また、実際に 0 を返す演算子 T* 内で確認できます。ただし、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 }
line add $0x30,%eax の直前に、%eax が 0 であることがわかります。これは、オペレーターが正しく NULL を返したことを示しています。
0x30を追加する行がここにあるのはなぜですか???