C/C++面试必备:new、delete与malloc、free的对比及delete[]的使用解析

5星 · 超过95%的资源 需积分: 4 20 下载量 150 浏览量 更新于2024-07-29 1 收藏 747KB PDF 举报
"C、C++笔试面试宝典2012版" C和C++是两种重要的编程语言,它们在软件开发中有着广泛的应用,特别是在系统级编程和高性能计算领域。面试中,对于C和C++的深入理解,尤其是内存管理和对象生命周期的掌握,通常是考察候选人技能的关键部分。以下是对标题和描述中涉及知识点的详细解释: 1. **内存管理:new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,用于动态内存分配和释放。它们不仅分配或回收内存,还会调用对象的构造函数和析构函数,以确保对象的正确初始化和清理。 - `malloc` 和 `free` 是C语言标准库中的函数,仅负责分配和释放原始的、未初始化的内存块,不涉及对象的构造和析构过程。 - 使用 `new` 分配的内存必须用 `delete` 来释放,而 `malloc` 分配的内存则需用 `free` 来释放。由于 `new` 和 `delete` 针对的是C++的对象,它们提供了构造和析构的机制,而 `malloc` 和 `free` 则没有这样的功能。 2. **delete与delete[]的区别** - 当使用 `delete` 操作符时,它只会调用对象的析构函数一次,适用于单个对象的释放。而 `delete[]` 会为数组中的每个元素调用析构函数,然后释放整个数组的内存,适用于数组对象的释放。 - 示例代码中,`delete[] pInt1` 和 `delete[] mTest1` 正确地释放了数组,但 `delete[] mTest2`(应为 `delete mTest2`)和 `delete[] pInt2`(应为 `delete pInt2`)会导致错误,因为它们试图用错误的运算符释放非数组对象。 - 对于内置类型(如 `int`),`delete` 和 `delete[]` 的行为相同,因为内置类型没有析构函数。但对于自定义类型,必须匹配使用 `new[]` 和 `delete[]`,否则可能导致内存泄漏或意外的行为。 3. **C、C++与Java的共同点和不同之处** - 共同点:这三种语言都是面向对象的语言,支持类和对象的概念,可以进行结构化编程,并且都有丰富的库支持。 - 不同点:C++ 是C的超集,提供了更高级的特性如模板、异常处理和多重继承。Java 是一种完全独立的语言,它具有垃圾回收机制,自动管理内存,且不支持指针操作,这使得Java更安全但可能牺牲一些性能。C语言则更加底层,程序员需要手动管理内存,且不支持类和对象,但它的效率通常更高。 在面试或笔试中,理解这些概念并能正确应用是至关重要的。熟悉内存管理、对象生命周期和语言特性不仅能够帮助编写出更健壮的代码,也是评估开发者技术能力的重要标准。