C/C++面试基础

   面试和平时做项目还是不太一样,平时写代码debug更多面对电脑,而面试是要去和面试官交流,侧重于能表达出东西,在较短的时间内了解彼此的契合度,去尽可能的展现自己。面试还是要提前做针对性的准备,对岗位要求和自己的技术栈、项目经历重合度较高的地方,进行重点总结,复习编程语言理论概念。

  • C语言如何避免踩内存

    三层防护去避免踩内存

    • 编码层面:所有指针初始化NULL,malloc使用sizeof推导大小,free后置为NULL,并且所有数组访问做边界检查
    • 设计层面:明确内存ownership,避免裸指针滥用
    • 工具层面:使用AddressSanitizer和Valgrind做运行时检测
      这样基本可以避免90%的内存问题。
  • 什么是裸指针

    • 裸指针是指只保存内存地址、没有任何生命周期、大小或所有权信息的普通指针。
    • 它不会自动管理内存,也没有边界保护,因此容易导致越界访问、use-after-free和double free。
    • 在工程中通常需要通过封装结构体或明确ownership语义来降低风险。
  • C++如何避免内存泄漏

    • 使用类封装数据,利用类的构造函数申请内存,析构函数释放内存
    • 使用智能指针,unique_ptr, share_ptre及weak_ptr
  • C和C++有什么区别

    • C++是面向对象的语言,C语言是面向过程的语言
    • C++引入new/delete运算符,取代了C中的malloc/free库函数
    • C++引入类、引用的概念,函数重载的特性,C中没有
  • 深拷贝和浅拷贝的区别

    • 主要区别在于如何处理对象内部动态分配的资源
    • 深拷贝是对对象的完全独立复制,包括对象内部动态分配的资源。不仅复制对象的值,也会复制对象所指向的堆上的数据
    • 深拷贝通常涉及到手动分配内存,并在拷贝构造函数或赋值操作符中进行资源的复制
    • 浅拷贝是对象内部动态分配的资源,新对象和原对象共享同一份
  • C++多态的实现

    • 编译时多态:父类里头方法重载,函数名相同,参数列表(参数个数/参数类型)不一样
    • 运行时多态:虚函数表管理父类指针指向子类指针,子类重写父类的虚函数
  • 右值引用

    • 右值引用是C++11引入的新特性,用&&表示,用来绑定临时对象。
    • 它主要用于实现移动语义,通过移动资源而不是拷贝对象来提升性能,比如在string或vector传递时可以避免大量内存拷贝。
    • 同时右值引用也是完美转发的重要基础。
  • 什么是万能引用

    • 在C++11中,如果 T&& 出现在模版类型推导中,它不是普通的右值引用,而是万能引用。
    • 万能引用能同时绑定左指和右值,具体类型通过模板推导和引用折叠规则决定。
    • 它主要用于实现完美转发,配合std::forward保持参数的原始值类别,是STL和范型编程的重要基础。
  • std::move是做什么的?

    • std::move本身并不会移动对象,它只是把对象转换为右值引用,从而允许调用移动构造函数或移动赋值函数。
    • 真正执行资源转移的是类的移动构造函数。
    • std::move的作用是显式地告诉编译器,这个对象的资源可以被转移。
  • 移动构造函数

    • 移动构造函数是C++11引入的,用右值引用作为参数。
    • 它通过转移对象内部资源而不是复制资源来构造新对象,从而避免昂贵的拷贝操作。
    • 移动构造通常在临时对象初始化或者使用std::move时触发,在STL容易扩容时也会大量使用。