jinchanchan 发表于 2024-12-11 10:02:44

C++ 面试题常用总结 详解 5(满足c++ 岗位必备,持续更新)

来自:碧波


三、内存

1. RAII是什么?

RAII 的核心思想是:资源的获取(如内存、文件句柄、网络连接等)与对象的初始化绑定在一起。具体来说,资源在对象的构造函数中获取,并在对象的析构函数中释放。

2.使用RAII的原因以及使用方法?

使用 RAII 的原因:

自动管理资源:利用对象的生命周期自动管理资源,避免忘记释放资源。

异常安全:即使发生异常,RAII 也能确保资源被正确释放,防止资源泄漏。

代码简洁:通过封装资源管理,减少代码重复和复杂性。

使用方法:

定义资源管理类:创建一个类,负责资源的分配和释放。

在构造函数中分配资源:例如,分配内存、打开文件等。

在析构函数中释放资源:确保资源在对象生命周期结束时得到释放。

3. new 和 malloc 的区别?delete 和 free 的区别?

new:是 C++ 操作符,用于动态分配内存并调用构造函数。它会返回指向新分配内存的指针,并且可以用 delete 释放内存。new 会调用对象的构造函数初始化对象。

malloc:是 C 标准库函数,用于动态分配内存,但不调用构造函数。它返回一个 void* 指针,需要强制转换为所需类型的指针。使用 malloc 分配的内存需要用 free 释放。

delete:用于释放 new 分配的内存,并调用析构函数。对于数组使用 delete[]。

free:用于释放 malloc 分配的内存。free 不会调用析构函数。

int* p = new int(10); // 使用 new
delete p;             // 使用 delete

int* q = (int*)malloc(sizeof(int)); // 使用 malloc
free(q);                        // 使用 free

4. C++的内存框架分布情况

C++ 的内存框架主要包括以下几个区域:

栈(Stack):用于存储局部变量和函数调用信息。栈内存分配速度快,但空间有限。

堆(Heap):用于动态分配内存。程序员可以控制分配和释放内存,但需要显式管理。内存的生命周期由程序员控制。

静态存储区(Static Storage Area):用于存储静态变量和全局变量。这些变量在程序运行期间一直存在。

常量区(Constant Data Area):用于存储常量数据,如字符串常量。

顺便吆喝一下,技术大厂,前后端测试捞人,近三周条件放宽,来看看!>>>机会

5. 什么是内存对齐,内存对齐有什么好处?

内存对齐 是将数据结构的内存地址按某个特定的对齐边界(通常是数据类型的大小)进行排列。对齐可以提高内存访问效率,因为许多处理器在对齐的数据上访问更快。

好处:

提高性能:对齐的数据结构能更有效地利用缓存和减少内存访问时间。

防止错误:某些硬件架构要求数据必须对齐,否则会引发硬件异常或性能下降。

6. 什么是内存泄漏?写代码时应该怎么防止内存泄漏。

内存泄漏 是指程序在动态分配内存后,没有释放这些内存,导致系统资源浪费并最终可能导致程序崩溃或变慢。

防止内存泄漏的方法:

使用 RAII:通过对象的生命周期自动管理资源。

智能指针:使用 std::unique_ptr 和 std::shared_ptr 管理动态内存,避免手动释放内存。

内存分析工具:使用工具如 Valgrind、AddressSanitizer 等检测和分析内存泄漏。

良好的编码实践:确保每个 new 都有对应的 delete,每个 malloc 都有对应的 free。

7. 说说什么是深拷贝和浅拷贝?

浅拷贝

定义:复制对象时,只复制对象的指针值,而不复制指针指向的内容。结果是原始对象和拷贝对象共享相同的资源。

问题:修改一个对象的资源会影响到另一个对象,可能导致资源冲突和错误。

深拷贝

定义:复制对象时,创建对象指针指向的资源的完整副本。这样,原始对象和拷贝对象各自拥有自己的资源。

好处:避免共享资源带来的问题,保证对象的独立性。


页: [1]
查看完整版本: C++ 面试题常用总结 详解 5(满足c++ 岗位必备,持续更新)