空对象指针为什么有时候能调用成员函数

在谈这个话题之前呢,还是得了解一下内存布局,以x86的32位系统为例:

在这里插入图片描述

然后得明确一点,NULL指针是无法访问的,如果强行访问,则会引发异常

在这里插入图片描述

然而空对象指针有时候却能够调用成员函数

class C
{
public:int a;static int b;static void f1(){cout << "fl" << endl;}void f2(){cout << "f2" << endl;}void f3(){cout << "f3:" << a << endl;}void f4(){cout << "f4:" << b << endl;}virtual void f5(){cout << "virtual f5" << endl;}
};int C::b = 10;int main()
{C* p = NULL;p->f1();   //正确p->f2();   //正确p->f3();   //错误p->f4();   //成功p->f5();   //错误return 0;
}

假设现在new了一个对象,并把它赋值给指针p,此时指针p则保存在栈上,对象中的a保存在堆上,b保存在.data段中(数据段),f1、f2、f3、f4和f5都保存在代码段,也就是说非静态成员变量在运行时储存在对象内部,成员函数并不储存在对象内部,而是位于程序的二进制代码里,所以与对象的地址无关。

为了方便理解,可以大致的认为编译会把以上代码转换为以下代码

class C
{
public:int a;virtual void f5(){cout << "virtual f5" << endl;}
};static int b = 10;static void f1(C* p)
{cout << "fl" << endl;
}void f2(C* p)
{cout << "f2" << endl;
}void f3(C* p)
{cout << "f3:" << p->a << endl;
}
void f4(C* p)
{cout << "f4:" << b << endl;
}

f1和f2调用成功,就是因为函数与对象的地址无关,即使是空地址,也不会去访问。

f4调用成功,因为除了函数与对象的地址无关之外,静态变量的地址也与对象无关。

f3调用失败,因为非静态成员变量在运行时储存在对象内部,在访问时,需要先对p解引用,然后才能访问找到堆中的数据,但是p是空指针,所以报错。

f5调用失败,因为f5是虚函数,在调用虚函数时,会通过虚函数表去查找函数的地址,而虚函数表(存放在.rodata中)可以看成是对象内的隐藏变量,因此也需要对指针p解引用,但是p是空指针,所以报错。

总的来说,空指针能够调用成员函数,其本质就是没有对这个空指针进行解引用,从而引发访问异常,在Linux下,又称为段错误(segmentation fault)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali linux下可用的wine QQ/微信

kali linux下可以使用网页版本的 QQ/微信。但是体验差强人意&#xff0c;无法截图&#xff0c;无法发送word中的复制文字&#xff0c;反而能发送excel表格中的复制文字&#xff0c;无法拖拽发送等多种难以接受的体验。 所以尝试wine 版本&#xff0c;好处是通过交叉编译&#…

【华为OD题库-078】查字典-Java

题目 输入一个单词前缀和一个字典&#xff0c;输出包含该前缀的单词 输入描述: 单词前缀字典长度字典 字典是—个有序单词数组 输入输出都是小写 输出描述: 所有包含该前缀的单词&#xff0c;多个单词换行输出 若没有则返回-1 示例1 输入: b 3 a b c 输出: b 示例2 输入: abc 4…

multipartFile转file类型方法

1&#xff1a;在Java中&#xff0c;可以通过MultipartFile对象的transferTo()方法将文件保存到本地临时文件中&#xff0c;并使用该临时文件创建一个File对象&#xff0c;进而得到File类型的文件 import org.springframework.web.multipart.MultipartFile; import java.io.Fil…

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

Python读写txt文件数据

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01; &#x1f…

html和css写淘宝的快速导航条

目录 1、css代码 2、html代码 1、css代码 <style>* {margin: 0;padding: 0;list-style: none;text-decoration: none;}.nav {width: 900px;height: 40px;background-color: rgb(247, 249, 250);margin: 50px auto;padding-left: 30px;}.nav>li {float: left;width: 1…

说说maven有什么优缺点?

Maven是一个流行的Java项目管理和构建工具&#xff0c;它可以帮助开发人员更有效地管理项目依赖关系、构建项目和部署代码。下面我将详细介绍Maven的优缺点&#xff1a; 优点&#xff1a; 一致性和标准化&#xff1a;Maven提供了一套标准的构建和项目管理工具&#xff0c;使得…

电力工程设计手册 全套31本

书号书名定价出版社名称9787519824358电力工程设计手册 01 火力发电厂总图运输设计200.00中国电力出版社9787519829780电力工程设计手册 02 火力发电厂热机通用部分设计210.00中国电力出版社9787519826994电力工程设计手册 03 火力发电厂锅炉及辅助系统设计290.00中国电力出版社…

云天励飞即将亮相“双数峰会”

第二届数字政府建设峰会暨数字湾区发展论坛即将在12月8-10日举办。本次“双数”峰会上&#xff0c;云天励飞将与CEC联合展示&#xff0c;重点展出大模型在数字政府领域的创新应用&#xff0c;以及云天励飞自主研发的大模型推理芯片。 “云天天书”包含通用大模型、行业大模型、…

昇腾npu上构建modelbox webUI开发容器教程

官方提供了modelbox webUI教程&#xff0c;但是&#xff0c;该教程有以下缺点&#xff1a; 在容器刚启动时&#xff0c;配置中的访问控制列表没有包含本地PC的IP&#xff0c;这导致如果想从本地PC访问远程服务器上容器的webUI&#xff0c;需要登入容器修改配置文件&#xff0c…

GO设计模式——2、工厂方法模式(创建型)

目录 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 工厂模式的核心角色 优缺点 代码实现 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 工厂方法模式&#xff08;Factory Method Pattern&#xff09;又叫作多态性工厂模式&#xff0c;指的…

Kali Linux 2023.4 已经发布了!

开发人员推出了 Kali Linux 2023.4&#xff0c;这是2023 年发行版的第四个也是最后一个版本。 新产品已经可供下载&#xff0c;包含15 个新工具和 GNOME 45。 Offective Security 团队报告称&#xff0c;在今年的最终版本中&#xff0c;操作系统中并没有添加太多新功能&…

什么是海牙公约?

一、什么是海牙公约&#xff1f; "海牙公约" 通常是指1899年和1907年两次在海牙举行的国际和平会议所达成的一系列国际公约。这两次会议的目标是通过国际合作来促进和平、防止战争&#xff0c;并制定一些规则和原则&#xff0c;以限制武装冲突的影响。以下是其中两个…

用 C 写一个卷积神经网络

用 C 写一个卷积神经网络 深度学习领域最近发展很快&#xff0c;前一段时间读transformer论文《Attention Is All You Need》时&#xff0c;被一些神经网络和深度学习的概念搞得云里雾里&#xff0c;其实也根本没读懂。发现深度学习和传统的软件开发工程领域的差别挺大&#xf…

Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍

一、前言 单页面应用(SPA)的核心思想之一&#xff0c;就是更新视图而不重新请求页面&#xff0c;简单来说&#xff0c;它在加载页面时&#xff0c;不会加载整个页面&#xff0c;只会更新某个指定的容器中的内容。对于大多数单页面应用&#xff0c;都推荐使用官方支持的vue-rou…

动态代理配置方法。如何使用代理IP保护隐私安全?

随着网络技术的不断发展&#xff0c;越来越多的人开始使用代理IP来保护自己的隐私安全。代理IP是一种通过代理服务器来访问网络的特殊技术&#xff0c;可以隐藏用户的真实IP地址&#xff0c;从而保护用户的隐私。本文将介绍动态代理的配置方法以及如何使用代理IP保护隐私安全。…

PyTorch 基础篇(1):Pytorch 基础

Pytorch 学习开始 入门的材料来自两个地方&#xff1a; 第一个是官网教程&#xff1a;WELCOME TO PYTORCH TUTORIALS&#xff0c;特别是官网的六十分钟入门教程 DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ。 第二个是韩国大神 Yunjey Choi 的 Repo&#xff1a;pytorch-t…

Transformer中的layer norm(包含代码解释)

在transformer中存在add&norm操作&#xff0c;add操作很简单&#xff0c;就是把注意力矩阵和原来的矩阵相加&#xff0c;也就是残差链接&#xff0c;可以有效减少梯度消失。如下图所示&#xff0c;为layer norm的解释图&#xff0c;可以看出layer norm是针对一个token来做的…

接口自动化测试总结,接口鉴权+加密与解密+数据库操作/断言...

前言 1、接口鉴权的多种方式 1&#xff09;后端接口鉴权常用方法 cookie&#xff1a; 携带身份信息请求认证 之后的每次请求都携带cookie信息&#xff0c;cookie记录在请求头中 token&#xff1a; 携带身份信息请求认证 之后的每次请求都携带token认证信息 可能记录在请求头…

Java随记

Java java保留两位小数 1、使用String.format()方法&#xff1a; public static void stringFormatdecimalFormatKeepTwoDecimalPlaces(){double number 3.1415926;String result String.format("%.2f", number);System.out.println(result);}输出&#xff1a;3…