C++面试关键:new、delete与malloc、free的区别

需积分: 14 0 下载量 195 浏览量 更新于2024-07-23 收藏 505KB PDF 举报
"C++面试题相关知识解析" 在C++编程中,动态内存管理是面试中经常被问到的话题,特别是在考察对象生命周期和内存管理能力时。以下是对标题和描述中涉及的知识点的详细说明: 1. **new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,专门用于对象的动态内存分配和释放,它们会处理对象的构造和析构过程。 - `malloc` 和 `free` 是C++/C语言标准库中的函数,用于原始的内存分配和释放,不涉及对象的构造和析构。 - `new` 在分配内存时会调用对象的构造函数,而在释放内存时调用析构函数。`malloc` 只负责分配内存,不执行任何构造或析构操作,`free` 则仅负责释放内存。 - 因为 `malloc/free` 不是C++运算符,它们无法处理类对象的初始化和清理工作,所以对于非基本数据类型,直接使用 `malloc/free` 可能会导致内存泄漏或未定义行为。 2. **delete与delete[]的区别** - 单个对象的动态分配使用 `new`,释放使用 `delete`,而数组的动态分配使用 `new[]`,释放使用 `delete[]`。 - 当使用 `delete` 操作符时,它只调用一次析构函数,适用于非数组对象。而 `delete[]` 对于数组,会先依次调用每个元素的析构函数,然后再释放内存,适用于数组对象。 - 示例代码中的 `-4-` 报错是因为尝试使用 `delete[]` 删除一个非数组对象 `mTest2`,这会导致未定义行为,因为 `mTest2` 是通过 `new MemTest` 分配的,应该用 `delete` 来释放。 3. **注意事项** - 使用 `new[]` 分配的内存必须用 `delete[]` 来释放,反之亦然,否则可能导致资源泄露或者意外的行为。数组和非数组对象的内存管理必须匹配。 - 内部数据类型(如 `int`)没有析构函数,所以使用 `delete` 或 `delete[]` 对它们进行释放通常不会有太大问题,但最好还是保持一致性,即 `new int[]` 应用 `delete[]`,`new int` 应用 `delete`。 - 在编写代码时,应尽量避免直接使用 `malloc` 和 `free`,以减少潜在的错误和兼容性问题,优先使用 `new` 和 `delete`。 理解这些基础知识对于成为一名合格的C++程序员至关重要,特别是在处理复杂的数据结构和内存管理时。在面试中,深入理解这些概念不仅能展示出对语言特性的掌握,还能体现良好的编程习惯和对程序正确性的关注。