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]

也会异常.

posted @   Saga007  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示