首页 > 高德地图-汽车业务-C++开发-一面 面经
头像
服务端老cpp
发布于 今天 09:44 上海
+ 关注

高德地图-汽车业务-C++开发-一面 面经

1. 实习期间主要负责什么模块?遇到过最难解决的问题是什么?怎么解决的?

这类问题考察实际动手能力和解决问题的思路。回答时建议用 STAR 法则:背景(做什么项目)、任务(负责哪块)、行动(怎么做的)、结果(效果如何)。

重点突出:主动承担的部分、遇到的技术难点、自己的思考过程,而不是只描述"我参与了某某项目"。如果有跨团队协作经验,也可以提一下沟通协调的方式。

2. 项目中有没有用到多线程?如何保证线程安全?

多线程是汽车业务中高频场景,比如地图数据加载、定位信息更新、路径规划并发计算等。

线程安全的常见手段:

  • 互斥锁(mutex):保护共享资源,注意避免死锁,推荐用 lock_guard/unique_lock 做 RAII 管理。
  • 读写锁(shared_mutex):读多写少的场景下,允许多个线程同时读,写时独占。
  • 原子操作(atomic):对简单类型(计数器、标志位)用 atomic 代替锁,性能更好。
  • 条件变量(condition_variable):用于线程间的等待通知,避免忙等。

设计上尽量减少共享状态,优先考虑无锁设计或消息队列解耦。

3. C++内存分区有哪些?各自存放什么?

C++运行时内存分为五个区域:

  • 栈区:局部变量、函数参数、返回地址,编译器自动管理,空间有限(一般几MB),访问快。
  • 堆区:new/malloc 手动申请,需要手动释放,空间大,管理不当会泄漏。
  • 全局/静态区:全局变量和 static 变量,程序启动分配,结束释放。.data 存已初始化的,.bss 存未初始化的。
  • 常量区:字符串常量、const 全局常量,只读。
  • 代码区:编译后的机器指令,只读可共享。

4. 虚函数和虚函数表的原理是什么?虚析构函数为什么重要?

虚函数通过 vtable 实现运行时多态。每个含虚函数的类有一张虚函数表,对象内部有 vptr 指向它,调用时通过 vptr 查表找到实际函数地址执行。

虚析构函数的重要性:当用基类指针 delete 一个派生类对象时,如果析构函数不是虚函数,只会调用基类析构,派生类的资源不会被释放,造成内存泄漏。加上 virtual 后,析构顺序是先派生类再基类,资源正确释放。

规则:只要类会被继承,析构函数就应该声明为 virtual。

5. 什么是内存泄漏?项目中如何排查?

内存泄漏是堆上申请的内存没有被释放,长期积累耗尽系统内存,在车载长时间运行的场景下尤其危险。

常见原因:

  • new 后忘记 delete,或异常路径跳过了 delete
  • 容器存裸指针,clear 时只释放了指针,没释放对象
  • 循环引用导致 shared_ptr 引用计数无法归零

排查方式:

  • Valgrind:Linux 下最常用,能精确定位泄漏位置
  • AddressSanitizer(ASan):编译时加 -fsanitize=address,运行时检测
  • 代码审查:重点检查每个 new 是否有对应 delete

根本解法是用智能指针替代裸指针,遵循 RAII 原则。

6. shared_ptr 和 unique_ptr 的区别是什么?什么场景用哪个?

  • unique_ptr:独占所有权,同一时刻只有一个指针管理对象,不可拷贝只能移动,开销极小,几乎等同于裸指针。适合明确单一所有者的场景。
  • sha

全部评论

(1) 回帖
加载中...
话题 回帖

近期热帖

热门推荐