当前位置: 首页 > 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.jsqmd.com/news/42552/

相关文章:

  • 数据采集与技术融合班级作业三102302119庄靖轩
  • Go语言AI智能体开发套件(ADK) - 构建复杂AI代理的开源框架
  • 2025年比较好的卡通布箱包布厂家推荐及选择指南
  • 2025年靠谱的1680D单双股布牛津布品牌厂家排行榜
  • AD加工文件导出记录
  • Ai元人文:新的期待——基于现状的共情协同架构
  • 2025年印刷固化灯优质厂家权威推荐榜单:紫外线灯板/曝光固化灯/生物成像紫光优质厂家精选
  • 戴尔PowerEdge R720服务器配置raid
  • 2025年热门的农药分散剂厂家最新热销排行
  • LC1513 全1子串数
  • 2025年优秀的321不锈钢带厂家推荐及采购指南
  • 基于LiveWire算法的MATLAB实现代码
  • 2025年雕花铝单板源头厂家权威推荐榜单:氟碳铝单板/阳极氧化铝单板/仿木纹铝单板源头厂家精选
  • LC2257 保卫格子
  • 2025年移动厕所定做厂家权威推荐榜单:垃圾分类屋/活动房/移动岗亭源头厂家精选
  • 2025江浙沪地区PLC控制柜制造企业综合实力榜:昆山华普拓电气蝉联技术创新与全球化服务双料标杆
  • 【LVGL】加载器部件
  • 2025年质量好的冷弯机组厂家选购指南与推荐
  • Windows 11 下安装 Codex,利用 MegaLLM 的 API 体验 GPT-5
  • 2025哪个出国留学机构好一点
  • 2025年浮筒推流曝气机定制厂家权威推荐榜单:自吸式推流曝气机/推流式曝气机/推流曝气机源头厂家精选
  • 2025留学机构十强
  • 2025杭州好的留学中介有哪些公司
  • 2025出国留学机构哪个好一点
  • 2025年山西高端博物馆展示柜厂家权威排行榜TOP10
  • 2025年诚信的梯形排水沟滑模机品牌厂家排行榜
  • 关于括号序列
  • WinRAR永久授权专用激活KEY方法(rarreg.key)
  • WGCLOUD能监控ARM架构的服务器吗
  • 2025年北京神秘调查公司权威推荐:暗访调研/神秘顾客督查/神秘访客服务机构精选