C/C++面试必知:new、delete与malloc、free的差异

需积分: 4 2 下载量 53 浏览量 更新于2024-07-26 收藏 747KB PDF 举报
"C、C++笔试面试宝典2010版" 在C++编程中,内存管理是非常关键的一部分,特别是在面试和笔试中,这部分知识经常被用来考察候选人的技能和理解。以下是对标题和描述中提及的知识点的详细解释: 1. **new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,专门用于动态内存分配和释放。`new` 会根据所申请的对象类型调用相应的构造函数来初始化内存,而 `delete` 在释放内存前会调用析构函数。它们是C++语言的一部分,由编译器直接支持。 - `malloc` 和 `free` 是C语言的标准库函数,位于`<cstdlib>`或`<stdlib.h>`中,仅负责分配和释放原始的未初始化的内存块,不涉及对象的构造和析构。因此,对于需要构造和析构的对象,单纯使用 `malloc` 和 `free` 是不够的。 2. **delete与delete[]的区别** - 当使用 `delete` 操作符时,它只释放一个对象的内存,并调用该对象的析构函数。如果这个对象是数组的首元素,那么只调用一次析构函数,不会遍历数组的所有元素。 - 相反,`delete[]` 是为动态分配的数组设计的,它会为数组中的每个元素调用析构函数,然后释放整个数组的内存。这意味着,如果你用 `new[]` 分配了一个对象数组,必须用 `delete[]` 来释放,否则,对于自定义类型,析构函数可能不会被正确调用,导致内存泄漏。 - 例子中,`delete[] mTest1` 和 `delete[] mTest2` 分别对应了对象数组和单个对象的正确释放。然而,试图用 `delete[]` 删除由 `new` 分配的单个对象(如 `-4-` 处所示)会导致错误,因为这会期望一个数组的结束标记,而实际只有一个对象。 3. **C、C++、Java的共同点与不同之处** - 共同点:三者都支持动态内存分配,都有类似于 `new` 或 `malloc` 的内存分配方式,以及类似 `delete` 或 `free` 的内存释放方式。它们都需要程序员手动管理内存,防止内存泄漏。 - 不同之处: - C++ 提供了构造函数和析构函数,使得对象在分配和释放时可以进行自定义的初始化和清理工作,而C语言则不支持这些功能。 - Java 使用垃圾回收机制,自动管理内存,程序员无需手动释放内存,但可能需要理解和处理内存回收带来的性能影响。 - C++ 的 `new` 和 `delete` 运算符可以处理对象数组,而C的 `malloc` 和 `free` 需要程序员自己处理数组元素的构造和析构。 - Java 中的动态内存分配是通过类的实例化(`new` 关键字)完成的,内存的释放则由垃圾回收器自动进行。 在准备C++的笔试或面试时,理解这些概念并能熟练应用是至关重要的,因为它们涉及到程序的正确性和效率。掌握内存管理的基本规则可以帮助避免常见的编程错误,如内存泄漏和悬挂指针,从而编写出更健壮的代码。