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用于在特定内存地址创建对象。
➡️