23.C++类对象的指针为空时,调用成员函数不会挂掉
最近工作的时候遇到了一个现象,当通过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)时,就会出现段错误。
所以,如果一个成员函数没有访问任何成员变量,请将这个成员函数设置为全局函数,如果设置为成员函数,当使用一个类对象的空指针也能访问成功,就会使得类对象失效的问题难以暴露出来
23.C++类对象的指针为空时,调用成员函数不会挂掉相关推荐
- 为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?...
看到<C++ Primer>中的一句话,才想起分析一下这个问题:"static 数据成员的类型可以是该成员所属的类类型.非 static 成员被限定声明为其自身类对象的指针或引用 ...
- 类的成员函数指针和静态成员函数指针 调用成员函数***
C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...
- 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...
- php调用成员函数错误,PHP致命错误:在非对象上调用成员函数exec...
我收到错误PHP致命错误:每当我调用类似的东西时,都在非对象上调用成员函数execute(),该对象引用-.-> execute()行. $select_str = 'select id, st ...
- php函数param太多,关于php:在非对象上调用成员函数bind_param()
本问题已经有最佳答案,请猛点这里访问. 我正在尝试在此准备好的语句中绑定变量,但我一直收到错误: Call to a member function bind_param() on a non-obj ...
- c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...
- 把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...
C.33: If a class has an owning pointer member, define a destructor C.33:如果类包含拥有所有权的指针成员,定义析构函数Reason ...
- C++ 类对象和 指针的区别
指针的情况 class Test{ public:int a;Test(){a = 1;} };int main() {Test* t1 = new Test();t1->a = 10;Test ...
- C++_类和对象_C++运算符重载_加号运算符重载_实现两个对象相加_对象和int类型相加_通过成员函数重载+号_全局函数重载+号_以及重载_运算符重载函数实现---C++语言工作笔记055
然后我们再来看,运算符的重载,首先我们来看加号的运算符的重载. 这个的作用是很明显的,比如我们有两个Person对象,p1,p2,如果我们想 p3 = p1+p2能可以嘛,不可以对吧,因为系统给我们提 ...
最新文章
- 面试前必知必会的二分查找及其变种
- 解决Android 7.0 App内切换语言不生效的问题
- Vue中使用v-for实现一对多数据的2层和3层嵌套循环
- 【收藏】蘑菇博客mogu_blog项目文档
- linux重定向多个文件,Linux base shell重定向详解
- SimpleExecutor.doQuery()-ResultSetHandler 处理结果集
- 对session和cookie的一些理解
- 实现一行或多行文字溢出隐藏显示省略号
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
- 关于ics lab8 performance中的smooth
- 掉电有点快!iOS15.4翻车:iPhone11/12/13更新后续航直接崩了
- 2013浙大878计算机基础综合大题答案解析
- 在C#中解析命令行参数的最佳方法? [关闭]
- Eclipse Maven编译报不支持muti-catch
- selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
- flutter 自带方法获取视频缩略图
- 知其然知其所以然之——word2vector
- [电机控制话题] 精辟!伺服电机、舵机、步进电机的区别
- wincap的学习总结01
- 京东登月机器学习平台 团队_发展您的安全团队并让机器人来完成工作