stdshared_ptr 采坑记录
作者:互联网
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