23.C++类对象的指针为空时,调用成员函数不会挂掉

本文探讨了C++中遇到的现象:空指针调用不使用this指针的成员函数时不会导致段错误。解释了成员函数本质上是地址调用,与成员变量不同,从而避免了内存访问问题。同时强调了区分全局函数与成员函数在空指针场景下的重要性。
摘要由CSDN通过智能技术生成

最近工作的时候遇到了一个现象,当通过C++类对象的空指针调用没有使用this指针的成员函数时,不会出现段错误

测试代码

#include <iostream>

using namespace std;

class test
{
public:
	test();
	~test();
	void func_not_use_this(){cout<<__func__<<endl;}
	void func_use_this() {cout<<__func__<<endl;a=10;}
	int a;
};

int main(int argc, char const *argv[])
{
	test *pt=nullptr;
	pt->func_not_use_this();
	pt->func_use_this();
	return 0;
}

原因分析

因为在C++中,类的成员函数并不占内存空间,成员函数的调用最终都会被编译器转化为一个全局函数的调用,成员函数只是个地址。所以即使类对象的指针为空,也可以正常调用。所以,对于对于成员函数的调用不会有问题

然而,因为成员变量是占用内存的,而test 对象的指针并没有指向一块有效的内存区域,所以,this指针是nullptr。所以,当使用这个空this指针访问具体的内存(比如成员变量a)时,就会出现段错误。

所以,如果一个成员函数没有访问任何成员变量,请将这个成员函数设置为全局函数,如果设置为成员函数,当使用一个类对象的空指针也能访问成功,就会使得类对象失效的问题难以暴露出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值