C++面试题整理 1

1. new和malloc什么区别?

new和malloc都用于在堆上分配内存,new是c++中的关键字,分配内存后还会调用构造函数

2. std中unorded_map,map,multimap有什么区别?

  • unorderd_map中元素不按键值排序,底层数据结构是哈希表,相对map查询速度快,内存开销大
  • map中元素按键值排序,底层数据结构是红黑树,相对unorderd_map,查询速度慢,内存开销小
  • multimap类似map,但是允许重复键值

3. C++中左值和右值的概念,以及使用右值常见的场景

简单来说,对于一个赋值表达式而言, 左侧的称之为左值,右侧的称之为右值。左值一般为常见的定义过的变量,在栈或堆上有具体的存储空间,右值一般为临时对象,作用域只限于赋值表达式期间。右值常见的有数字/字符常量,函数返回的非引用值,临时构造的对象。

4. C++内存泄漏怎么出现,如何定位与解决

内存泄漏是由于在堆上new出来的空间,没有delete释放掉导致的。可以通过重载new/delete加入log信息,比较申请和释放的内存,从而得知是否有内存泄漏;也可以通过各种检测工具,Windows下有UMDH,Linux下有valgrind工具

5. 解释下linux下虚拟地址空间

操作系统为了解决多进程管理中安全和效率问题,为每个进程分配的是虚拟内存地址,各内存地址相互隔离。在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,用户空间又分为栈,堆,数据,程序文件等。

6. 同步/异步与阻塞/非阻塞的区别

同步指的一条指令执行完,再执行下一条执行,各指令按照顺序依次执行,异步指的是,两条指令可以同时执行。阻塞指的是一个线程需要等待另一个线程的结果时,阻止当前线程继续向下执行,而非阻塞则是不阻止当前线程。

7. 有哪些架构类型

单体架构、分布式应用、微服务与Serverless