标签:__ stdshared 调用 采坑 GetNumber Info MyClass ptr ecx
std::shared_ptr 采坑记录
class MyClass
{
public:
MyClass();
~MyClass();
int GetNumber();
private:
};
MyClass::MyClass()
{
printf(__FUNCTION__);
}
MyClass::~MyClass()
{
printf(__FUNCTION__);
}
int MyClass::GetNumber()
{
printf(__FUNCTION__);
return 123;
}
int main()
{
std::shared_ptr<MyClass> Info;
printf("%d \n", Info->GetNumber());
getchar();
}
正常来说Info 没赋值.Info 指针为空,那么GetNumber肯定是异常的
奇怪的是函数正常调用 输出确实是 123 而且构造函数也没有被调用!
后面调试发现 Info 并不是真正的空指针.里面包装的MyClass指针才是nullptr
所以在调用Info->GetNumber()时
先取出info->保存的MyClass this指针赋值ecx,再调用 MyClass::GetNumber函数地址
重点来了,this指针是nullptr,然后GetNumber是普通的类函数所以调用方式就是
mov ecx,this
call GetNumber
这样就算类指针是空 也能正常执行.因为这个函数没有操作任何关于类指针的操作,只是返回了一个 123整数.
如果稍微改一下加一个类成员变量或改成调用父类的成员,就会异常.
如果操作类成员变量.肯定要操作ecx,因为ecx 为nullptr 所以异常
如果事调用父类函数,调用就变成了
mov ecx,this
mov [ecx + offset]
也会异常.
标签:__,stdshared,调用,采坑,GetNumber,Info,MyClass,ptr,ecx 来源: https://www.cnblogs.com/CitrusZero/p/16527173.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。