- C++内存释放: 在C++中,动态分配的内存通过new操作符分配,并通过delete操作符释放。当不再需要对象时,应当确保正确调用delete以防止内存泄漏。现代C++中,智能指针如std::unique_ptr、std::shared_ptr等可以自动管理内存,避免手动释放带来的问题。此外,内存管理还涉及到内存对齐、内存碎片等问题,以及STL容器如何在内部进行内存管理优化。
- 进程和线程的区别:
● 进程是操作系统资源分配的基本单位,每个进程都有独立的地址空间、全局变量、堆栈等资源,进程之间相互隔离,通信需通过IPC机制(如管道、共享内存、消息队列等)。
● 线程是CPU调度和执行的基本单位,同一进程内的多个线程共享相同的地址空间、全局变量等资源,线程间通信成本较低,可以通过读写共享数据或使用互斥锁、条件变量等同步原语实现。 - 熟悉的数据结构及其区别:
● 栈(Stack):后进先出(Last In First Out, LIFO)的数据结构,主要支持push(入栈)、pop(出栈)操作,常用于函数调用栈、表达式求值等场景。
● 队列(Queue):先进先出(First In First Out, FIFO)的数据结构,主要支持enqueue(入队)、dequeue(出队)操作,广泛应用于任务调度、消息传递等领域。 - 哈希表与哈希冲突解决: 哈希表是一种通过哈希函数将键映射到数组索引,从而快速查找和存储数据的数据结构。当两个不同的键经过哈希函数计算后得到相同的索引值时,就会发生哈希冲突。常见的解决方法有开放寻址法(比如线性探测、二次探测等)和链地址法(即每个数组元素指向一个链表,相同哈希值的键放入同一个链表中)。
- 多线程编程及线程通信、线程互斥:
● 多线程编程:在单个进程中创建并运行多个并发执行路径,提高程序执行效率。
● 线程通信:可通过共享内存、信号量、互斥量、条件变量等方式实现线程间的协同工作和数据交换。
● 线程互斥:为了避免多个线程同时访问和修改同一资源导致数据不一致,通常采用互斥锁(mutex)来保护临界区代码,保证任何时刻只有一个线程能够访问受保护的资源。 - 查找、排序算法:
○ 查找算法包括:线性查找、二分查找(适用于有序数组)、哈希查找(通过哈希表实现近乎常数时间复杂度的查找,但需处理哈希冲突)、二叉搜索树查找等。
○ 排序算法包括:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。其中,C++ STL提供的sort函数实现了高效稳定的排序算法,默认采用的是introsort(快速排序、堆排序和插入排序的混合),而stable_sort则保证排序稳定性。 - 常用的数据结构(STL标准库):
○ 栈(stack):后进先出(LIFO)容器,提供了push, pop, top等操作。
○ 队列(queue):先进先出(FIFO)容器,支持push(enqueue), pop(dequeue)操作。
○ 哈希表(unordered_map/unordered_set):基于哈希函数实现键值对的快速存储与查找,内部使用链地址法或开放寻址法解决冲突。
○ 有序关联容器(map/set):基于红黑树实现,键自动排序,提供log(n)时间复杂度的插入、查找、删除操作。 - STL中map与unordered_map的区别:
○ std::map:键值对按照键的升序排列,内部使用红黑树实现,查找、插入、删除的时间复杂度均为O(log n)。
○ std::unordered_map:不保证元素顺序,使用哈希表实现,理想情况下查找、插入、删除操作的时间复杂度接近O(1),但实际取决于哈希函数的质量及负载因子等因素。 - C++11新特性:
○ 自动类型推导(auto关键字)
○ 列表初始化
○ 右值引用(rvalue reference)与移动语义
○ 引入智能指针(unique_ptr, shared_ptr, weak_ptr)
○ 函数式编程支持(lambda表达式、std::bind)
○ 变量声明与定义合并(extern template)
○ 多线程支持(库)
○ 并发容器(如mutex, atomic, condition_variable等) - C++面向对象三大特性及其功能:
○ 封装(Encapsulation):隐藏对象的内部细节,只暴露必要的接口,提高代码重用性和安全性。
○ 继承(Inheritance):子类继承父类的属性和行为,实现代码复用和层次化分类。
○ 多态(Polymorphism):同一消息可以根据接收者的不同产生不同的行为效果,分为静态多态(函数重载、运算符重载、模板)和动态多态(虚函数机制,基类指针指向派生类对象调用方法时体现)。 - 多态的实现:
○ C++中多态主要通过虚函数(virtual function)机制实现。当基类定义虚函数时,派生类可以覆盖该函数,此时通过基类指针或引用调用虚函数时会根据指针实际指向的对象类型确定调用哪个版本的函数。 - 继承的理解与实现:
○ 继承体现了“is-a”关系,允许派生类继承基类的非私有成员(属性和方法)。在C++中,通过关键字class DerivedClass : access_specifier BaseClass来实现继承,access_specifier可以是public、protected或private,分别决定了基类成员在派生类中的可见性。 - C++内存管理:
○ C++内存管理涉及动态内存分配(new/delete)、栈内存分配(局部变量)、堆内存管理、构造函数与析构函数的作用、智能指针的使用以减少内存泄漏和悬挂指针等问题。现代C++更推荐使用RAII(Resource Acquisition Is Initialization)原则,通过构造函数获取资源并在析构函数释放资源,以及使用STL容器和智能指针来简化内存管理。
c++八股6
最新推荐文章于 2024-08-21 18:16:36 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)