C++面试题:new/delete与malloc/free详解及delete[]特性和错误示例

版权申诉
0 下载量 125 浏览量 更新于2024-07-18 收藏 65KB DOCX 举报
在C++编程中,内存管理是至关重要的一个环节,尤其是在笔试面试中常被考察。本文档主要关注了两个关键知识点:`new`、`delete`、`malloc`和`free`之间的关系,以及`delete`与`delete[]`的区别。 首先,`new`和`delete`是C++特有的运算符,它们在内存管理中扮演了核心角色。`new`用于动态地分配内存,并在内存中调用对象的构造函数,确保对象在内存中被正确初始化。例如,`MemTest*mTest1 = new MemTest[10];`这行代码会为一个包含10个`MemTest`对象的数组分配内存,并为每个对象调用构造函数。同样,`delete mTest1;`会在释放内存前调用每个对象的析构函数。 相反,`malloc`和`free`是C/C++标准库提供的内存管理函数,它们主要用于底层的内存操作。`malloc`用于分配内存,但不会自动调用构造函数,用户需要手动进行初始化。`free`则用于释放内存,但不会执行析构函数。由于`malloc`和`free`与C++的对象生命周期管理不直接关联,因此不适合用于动态对象的内存管理。 `delete`与`delete[]`的主要区别在于处理数组的情况。`delete`仅对单个对象调用析构函数,如果试图用它来删除数组,例如`delete pInt1;`,将导致错误,因为`pInt1`实际上是指向数组的指针,而非单个对象。相反,`delete[]`专门设计用于删除数组,它会遍历数组中的每个元素并调用其析构函数,之后再释放整个数组的内存。例如,在`delete[] pInt1;`中,每个`int`类型的元素都会被正确地析构。 总结来说,选择`new`和`delete`还是`malloc`和`free`,取决于是否需要对象的构造/析构操作,以及是否需要管理数组。对于自定义类型,特别是那些含有复杂数据结构或资源的类,一定要确保正确地使用`delete[]`来避免内存泄漏和资源未释放的问题。在面试中,理解这些概念的正确用法以及它们之间的差异,能够展示出你的C++内存管理能力,对于求职非常重要。