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的作用是显式地告诉编译器,这个对象的资源可以被转移。
- std::move本身并不会移动对象,它只是把对象转换为右值引用,从而允许调用移动构造函数或移动赋值函数。
移动构造函数
- 移动构造函数是C++11引入的,用右值引用作为参数。
- 它通过转移对象内部资源而不是复制资源来构造新对象,从而避免昂贵的拷贝操作。
- 移动构造通常在临时对象初始化或者使用std::move时触发,在STL容易扩容时也会大量使用。