准备C/C 面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C 编程相关的问题,这将有助于你在面试中脱颖而出。希望这些建议对你有所帮助,祝你面试顺利!
内存泄漏(类似避免野指针一样)
内存泄漏是指在计算机程序中,动态分配的内存没有被释放,导致持续占用系统内存。
C 使用new
分配内存后,应该使用delete
释放内存。在C中,使用malloc
分配内存后,应该使用free
释放内存。
指针丢失或被覆盖。
代码语言:javascript复制int* ptr = new int(42); // 动态分配内存并初始化为 42
int* ptr2 = ptr; // ptr2 指向与 ptr 相同的内存
delete ptr; // 释放内存,ptr2 仍然指向已释放的内存
循环引用。
代码语言:javascript复制class Node {
public:
std::shared_ptr<Node> next;
// ...
};
int main() {
shared_ptr<Node> node1 = make_shared<Node>();
shared_ptr<Node> node2 = make_shared<Node>();
node1->next = node2; // node1 引用 node2
node2->next = node1; // node2 引用 node1
// 循环引用,node1 和 node2 的引用计数永远不会降为零
return 0;
}
静态成员变量和静态成员函数
- 静态成员变量:
- 静态成员变量必须在类内声明,类外初始化。
- 静态成员函数:
- 静态成员函数只能访问静态成员变量和静态成员函数,不可以访问类的非静态成员变量或非静态成员函数,而非静态成员函数都可以访问。
静态链接库与动态链接库的区别
静态链接库和动态链接库是两种不同的库文件,用于在软件开发中管理和重用代码。它们有以下主要区别:
- 链接方式:静态链接库在编译时将代码和数据与可执行程序一起链接,形成一个独立的可执行文件。而动态链接库的代码和数据保留在单独的库文件中。
- 大小:静态链接库包含库的副本,因此可执行文件通常较大。而动态链接库的多个程序可以共享相同的库,因此可执行文件较小。
- 更新和维护:静态链接库的维护成本较大,而动态链接库较低
- 性能:静态链接库性能更快,但占用更多的内存
堆是不是二叉树
堆通常是完全二叉树。堆主要分为两种类型:大根堆和小根堆。
- 大根堆:在大根堆中,父节点的值始终大于或等于其子节点的值。
- 小根堆:在小根堆中,父节点的值始终小于或等于其子节点的值。
遇到过程序崩溃的情况吗,如何优化程序(单独写)
参考链接:程序崩溃与优化
sizeof
参考链接: sizeof与strlen
C 新特性
- 自动类型推断:使用
auto
关键字可以让编译器推断变量的类型,减少了类型冗余,提高了代码的可读性。 - 范围循环:引入
for
循环的新语法,使遍历容器和数组更加简洁。 - 智能指针:
std::shared_ptr
、std::unique_ptr
和std::weak_ptr
等智能指针类,用于管理动态内存分配,提高内存管理的安全性和可靠性。 - 移动语义:引入右值引用和移动构造函数,允许高效地转移对象的资源,提高性能。
- Lambda 表达式:引入匿名函数,允许在代码中定义小型函数,用于处理回调函数等。
其他
- 多线程支持:引入
std::thread
、std::mutex
、std::condition_variable
等多线程库,使C 更好地支持并发编程。 - 统一初始化语法:允许使用大括号
{}
进行统一的初始化,包括初始化对象、数组、容器等。 - 标准库改进:引入了许多新的标准库容器和算法,如
std::unordered_map
、std::unordered_set
、std::array
,以及更多的标准算法。 - 类型别名:通过
using
关键字,可以为类型创建别名,提高代码可读性。 - 可变参数模板:引入可变参数模板,允许编写泛型代码以处理可变数量的参数。
- std::tuple:引入元组数据结构,用于组合不同类型的数据。
- constexpr 函数:引入
constexpr
函数,用于在编译时执行计算,以提高性能和代码优化。 - 异常规范:引入
noexcept
关键字,用于指示函数是否会抛出异常。 - 新的标准库特性:C 标准库得到了大幅扩展,包括
<thread>
、<chrono>
、<regex>
、<functional>
等头文件的引入。