其他分享
首页 > 其他分享> > stdshared_ptr 采坑记录

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