C++ 面试问题

💡 原文英文,约1500词,阅读约需6分钟。
📝

内容提要

这篇文章是关于C++面试问题的后续,介绍了局部变量、delete和delete[]的区别、赋值运算符的实现、std::map和std::unordered_map的区别、虚函数的实现以及错误的修复方法。这些问题适用于C++编程职位的面试。

🎯

关键要点

  • 这篇文章是关于C++面试问题的后续,适用于C++编程职位的面试。
  • 局部变量在函数返回后会消失,导致引用成为悬空引用。
  • delete用于销毁单个对象,delete[]用于销毁对象数组。
  • 赋值运算符需要实现深拷贝,避免内存泄漏和双重删除的问题。
  • std::map使用平衡二叉树实现,平均和最坏情况下的时间复杂度为O(lg n),而std::unordered_map使用哈希表实现,平均时间复杂度为O(1)。
  • 虚函数通过虚表(vtbl)和虚指针(vptr)实现,确保运行时的多态性。
  • 构造函数中如果抛出异常,可能导致部分构造的对象内存泄漏。
  • 使用std::unique_ptr可以避免内存泄漏问题。
  • placement new用于在特定内存地址创建对象,需确保地址对齐和大小合适。
  • 销毁placement new创建的对象需要显式调用其析构函数。

延伸问答

局部变量在函数返回后会发生什么?

局部变量在函数返回后会消失,导致引用成为悬空引用。

delete和delete[]有什么区别?

delete用于销毁单个对象,而delete[]用于销毁对象数组。

如何实现赋值运算符以避免内存泄漏?

需要实现深拷贝,确保在赋值前删除已有指针,并分配新的内存。

std::map和std::unordered_map的时间复杂度有什么不同?

std::map的时间复杂度为O(lg n),而std::unordered_map的平均时间复杂度为O(1)。

虚函数是如何在C++中实现的?

虚函数通过虚表(vtbl)和虚指针(vptr)实现,确保运行时的多态性。

placement new的用途是什么?

placement new用于在特定内存地址创建对象。

➡️

继续阅读