最近在查CWnd::GetSafeHwnd()
函数时,顺带发现了一个关于CWnd::GetSafeHwnd()
的实现过程的讨论,其中讨论过程涉及到了空指针调用成员函数的问题,恰巧之前工作项目中也有偶遇到相关的知识,因此在此总结一下相关知识。
vfptr
类声明:
class CStringHelper
{
public:
CStringHelper();
virtual ~CStringHelper();
int DoNothing();
void SetStringFlag();
virtual int DoVirtualFunc();
protected:
int m_nStringFlag = 1;
static int ms_nCommVar;
};
类实现:
#include "StringHelper.h"
int CStringHelper::ms_nCommVar = 100;
CStringHelper::CStringHelper()
{
}
CStringHelper::~CStringHelper()
{
}
int CStringHelper::DoNothing()
{
int k = 0;
++ms_nCommVar;
return ms_nCommVar;
}
void CStringHelper::SetStringFlag()
{
int x = DoNothing();
m_nStringFlag = 2;
}
int CStringHelper::DoVirtualFunc()
{
int y = DoNothing();
return y;
}
CStringHelper *pStringHelper = NULL;
pStringHelper->DoNothing();
pStringHelper->SetStringFlag();
DoNothing
正常SetStringFlag
过程中,调用DoNothin
正常返回,执行到m_nStringFlag = 2;
语句时崩溃m_nStringFlag
其实是this->m_nStringFlag
)。只有当访问成员变量时,且传入的this指针为空时才会崩溃。 CStringHelper *pStringHelper = NULL;
pStringHelper->DoVirtualFunc();
pStringHelper->DoVirtualFunc();
语句时崩溃vfptr
vfptr
自动变量
中可以看出:vfptr
都是相同的(可以从实验结果观察出该事实)class CEmptyClass
{
public:
CEmptyClass();
virtual ~CEmptyClass();
};
顺带一提,如果没有虚函数,sizeof得到的值为1。原文:https://www.cnblogs.com/HelloGreen/p/11522263.html