空指针能工作的意外使用,2024.09.01

Object* pObj = nullptr;

空指针是指向nullptr的指针,比如pObj就是一个例子。

空指针能被使用去调用一个方法吗?

通常人们说不能,因为空指针所指没有对象,没对象,那也就不存在方法的调用了。

但实际上存在意外:

class Names
{
public:
	Names() = default;
	~Names() = default;
	std::string GetTestName()
	{
		return "TestName";
	}
	std::string GetName()
	{
		return m_Name;
	}
private:
	std::string m_Name = "RealName";
};


void CCxxTestDlg::RunTest()
{
	m_strOutput = _T("已经运行。\r\n");
	Names* pName = new Names;
	delete pName;
	pName = nullptr;
	m_strOutput += pName->GetTestName().c_str();
	m_strOutput += "\r\n";

上面的简单代码,你能看到

delete pName;

这行代码,不会将指针pName设置为nullptr,因此需要手动在后面行设置为nullptr。

pName = nullptr;

按理说pName这里已经被置空了,不能再被调用方法了。

m_strOutput += pName->GetTestName().c_str();

但意外的是,这行代码,pName一个空指针,调用pName->GetTestName()方法是能工作的。

这是输出结果,红线所示是输出的TestName。

当然,pName->GetName()就不行了。

实际上,这个意外例子还可以更简单。

	Names* pName = nullptr;
	m_strOutput += pName->GetTestName().c_str();
	m_strOutput += "\r\n";

这样就可以了,代码能工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值