当前位置: 首页 > news >正文

金山面试官问:用空指针调用一个空函数的时候会发生什么?

面试官写了这样一个类和函数调用
class A {
public:
void func() {
// 函数体为空
}
};

int main() {
A* ptr = nullptr; // 空指针
ptr->func(); // 用空指针调用func()
return 0;
}
的确让人疑惑,他应该是想考察当空指针调用类的非虚成员函数时,程序通常会正常知行,不会立即崩溃(但是这属于未定义行为)
但是C++规定通过空指针调用非静态成员函数属于未定义行为。(如果函数体中包含了对其他变量或者调用其他依赖this指针的操作),编译器也可能生成访问this指针的代码(如调试信息、栈帧处理),导致程序崩溃。

正确解释:C++中,非虚成员函数的调用不依赖对象的实际内存,而是在编译时通过类名确定函数地址(类似于静态绑定)。
注:①成员函数的底层实现会隐含一个this指针参数,指向调用该函数的对象。②当函数体为空的时候,即使this指针式nullptr,函数执行过程不会访问this指向的内存(因为没有任何操作),因此可能“侥幸”崩溃。

如果func()是虚函数,情况就完全不同了;必然崩溃。
class A {
public:
virtual void func() {} // 虚函数
};

int main() {
A* ptr = nullptr;
ptr->func(); // 必然崩溃
return 0;
}
虚函数调用需要通过对象的虚函数表查询函数地址,而vptr(虚函数表指针)存储在对象的内存中,空指针指向的内存无效,访问vptr会直接导致内存错误,程序崩溃。

金山大佬们还是考察对类的封装比较深入的,进一步深入了解类中成员的内存分布

http://www.zskr.cn/news/51952.html

相关文章:

  • 数据采集与技术融合班级作业三102302119庄靖轩
  • Go语言AI智能体开发套件(ADK) - 构建复杂AI代理的开源框架
  • 2025年靠谱的1680D单双股布牛津布品牌厂家排行榜
  • AD加工文件导出记录
  • 2025年印刷固化灯优质厂家权威推荐榜单:紫外线灯板/曝光固化灯/生物成像紫光优质厂家精选
  • 戴尔PowerEdge R720服务器配置raid
  • 2025年优秀的321不锈钢带厂家推荐及采购指南
  • 2025年移动厕所定做厂家权威推荐榜单:垃圾分类屋/活动房/移动岗亭源头厂家精选
  • 2025江浙沪地区PLC控制柜制造企业综合实力榜:昆山华普拓电气蝉联技术创新与全球化服务双料标杆
  • Windows 11 下安装 Codex,利用 MegaLLM 的 API 体验 GPT-5
  • 2025年浮筒推流曝气机定制厂家权威推荐榜单:自吸式推流曝气机/推流式曝气机/推流曝气机源头厂家精选
  • 2025出国留学机构哪个好一点
  • 关于括号序列
  • WinRAR永久授权专用激活KEY方法(rarreg.key)
  • WGCLOUD能监控ARM架构的服务器吗
  • 2025年评价高的液压缸厂家最新热销排行
  • 2025年靠谱的吊钩式抛丸机厂家选购指南与推荐
  • 2025年浓缩脱水分离机厂家权威推荐:卧式螺旋离心机/污泥脱水离心机/沉降离心机设备实力企业精选
  • 颜色网站为啥都收费?自己做个要花多少钱?
  • 01-playwright和selenium的区别?
  • 上周热点回顾(11.10
  • Julie Pro V121: Bypass Immobilizer Emulate ESL/ELV for European/American Vehicle Repairs
  • 2025年比较好的燃气报警器检测高评分推荐
  • 2025年国内抗衰老设备与技术综合实力排行榜TOP10
  • 2025年质量好的非笼养草鸡蛋品质口碑榜
  • 2025年热门的照明工程行业公信力榜
  • 2025年山体边坡防护网厂商权威推荐榜单:主动边坡防护网/边坡防护网源头厂家精选
  • Vue的props和emits -- 组件通信
  • 新业务来不及测?用Dify工作流,3天搭出完整回归测试体系,快速响应变化
  • 2025年多工位转盘机源头厂家权威推荐榜单:伺服压装机/伺服液压机/铜铝排冲孔机源头厂家精选