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]
也会异常.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具