最近工作的时候遇到了一个现象,当通过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++类对象的指针为空时,调用成员函数不会挂掉相关推荐

  1. 为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?...

    看到<C++ Primer>中的一句话,才想起分析一下这个问题:"static 数据成员的类型可以是该成员所属的类类型.非 static 成员被限定声明为其自身类对象的指针或引用 ...

  2. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  3. 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...

  4. php调用成员函数错误,PHP致命错误:在非对象上调用成员函数exec...

    我收到错误PHP致命错误:每当我调用类似的东西时,都在非对象上调用成员函数execute(),该对象引用-.-> execute()行. $select_str = 'select id, st ...

  5. php函数param太多,关于php:在非对象上调用成员函数bind_param()

    本问题已经有最佳答案,请猛点这里访问. 我正在尝试在此准备好的语句中绑定变量,但我一直收到错误: Call to a member function bind_param() on a non-obj ...

  6. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

    本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...

  7. 把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...

    C.33: If a class has an owning pointer member, define a destructor C.33:如果类包含拥有所有权的指针成员,定义析构函数Reason ...

  8. C++ 类对象和 指针的区别

    指针的情况 class Test{ public:int a;Test(){a = 1;} };int main() {Test* t1 = new Test();t1->a = 10;Test ...

  9. C++_类和对象_C++运算符重载_加号运算符重载_实现两个对象相加_对象和int类型相加_通过成员函数重载+号_全局函数重载+号_以及重载_运算符重载函数实现---C++语言工作笔记055

    然后我们再来看,运算符的重载,首先我们来看加号的运算符的重载. 这个的作用是很明显的,比如我们有两个Person对象,p1,p2,如果我们想 p3 = p1+p2能可以嘛,不可以对吧,因为系统给我们提 ...

最新文章

  1. 面试前必知必会的二分查找及其变种
  2. 解决Android 7.0 App内切换语言不生效的问题
  3. Vue中使用v-for实现一对多数据的2层和3层嵌套循环
  4. 【收藏】蘑菇博客mogu_blog项目文档
  5. linux重定向多个文件,Linux base shell重定向详解
  6. SimpleExecutor.doQuery()-ResultSetHandler 处理结果集
  7. 对session和cookie的一些理解
  8. 实现一行或多行文字溢出隐藏显示省略号
  9. 简要介绍BASE64、MD5、SHA、HMAC几种方法。
  10. 关于ics lab8 performance中的smooth
  11. 掉电有点快!iOS15.4翻车:iPhone11/12/13更新后续航直接崩了
  12. 2013浙大878计算机基础综合大题答案解析
  13. 在C#中解析命令行参数的最佳方法? [关闭]
  14. Eclipse Maven编译报不支持muti-catch
  15. selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
  16. flutter 自带方法获取视频缩略图
  17. 知其然知其所以然之——word2vector
  18. [电机控制话题] 精辟!伺服电机、舵机、步进电机的区别
  19. wincap的学习总结01
  20. 京东登月机器学习平台 团队_发展您的安全团队并让机器人来完成工作

热门文章

  1. HashMap和HashSet的区别
  2. HDU 3826 Squarefree number:题目解答源码
  3. [Objective-C] 如何定义Block(块)
  4. python之变量操作
  5. Spark源码学习之IDEA源码阅读环境搭建
  6. hadoop集群的白名单和黑名单示例说明
  7. sklearn计算两个向量之间的距离
  8. 机器学习项目实战----信用卡欺诈检测
  9. SQL查询一个表中另外一个表不存在的数据
  10. Centos7安装Nginx+PHP