C++面试必备:new、delete与malloc、free的区别

需积分: 9 4 下载量 88 浏览量 更新于2024-07-29 收藏 488KB DOC 举报
"C++经典面试题集合,包含2011年的面试知识点,适合C/C++学习者和面试者复习准备。" 在C++编程语言中,内存管理是核心概念之一,尤其在面试中经常被问及。以下是两个关键知识点的详细说明: 1. **new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,用于动态内存分配和释放。`new` 不仅分配内存,还会根据需要调用构造函数来初始化对象。相反,`delete` 在释放内存前会调用析构函数,确保对象的清理工作得以完成。 - `malloc` 和 `free` 是C语言标准库中的函数,在C++中也可以使用,但它们仅处理原始字节的分配和释放,不涉及对象的构造和析构。因此,对于需要构造和析构的对象,单纯使用 `malloc` 和 `free` 是不够的。 - `new` 和 `malloc` 的区别在于,`new` 可以用于类对象的创建,可以调用构造函数;而 `malloc` 只能分配原始内存,不涉及对象生命周期的管理。同样,`delete` 和 `free` 的区别在于 `delete` 可以处理对象的析构,而 `free` 只做内存释放。 2. **delete与delete[]的区别** - 当使用 `delete` 操作符时,如果释放的是一个单一对象,它只调用一次析构函数。如果释放的是一个数组,只调用一次析构函数,但这是在C++标准之前的遗留行为,并不推荐。现在的C++标准要求使用 `delete[]` 来释放数组,因为它会为数组中的每个元素分别调用析构函数,确保所有对象都被正确清理。 - 使用 `delete[]` 适用于通过 `new[]` 分配的数组,它会按顺序调用数组中每个元素的析构函数,然后释放内存。而单个 `delete` 仅用于释放通过单独 `new` 分配的对象。 - 示例中,`delete[] mTest1` 和 `delete[] pInt1` 正确地使用了 `delete[]` 来释放数组,但 `delete[] mTest2` 和 `delete[] pInt2` 报错,因为它们试图使用 `delete[]` 释放非数组对象,这是不正确的。应该使用 `delete` 来释放这些非数组对象,即 `delete mTest2` 和 `delete pInt2`。 总结来说,理解和正确使用 `new`、`delete`、`malloc` 和 `free`,以及它们之间的关系,是C++程序员必备的技能。在处理对象和数组时,必须确保匹配使用 `new[]` 和 `delete[]`,以避免内存泄漏和未定义的行为。在面试中,掌握这些知识点可以显著提高面试者的专业素养。