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

需积分: 10 10 下载量 139 浏览量 更新于2024-07-26 收藏 864KB PDF 举报
"C++笔试面试常见知识点解析" 在C++编程中,理解和掌握动态内存管理是至关重要的,特别是在面试和笔试中,这部分知识常常被考察。以下是关于C++动态内存管理的一些关键点: 1. `new`、`delete`、`malloc`、`free`的关系: - `new` 和 `delete` 是C++中的运算符,它们负责对象的创建和销毁,同时管理内存。`new` 在分配内存后会调用对象的构造函数,而 `delete` 在释放内存前会调用析构函数。它们是C++特有的,具有类型安全性和对象生命周期管理的特性。 - 相反,`malloc` 和 `free` 是C语言的标准库函数,仅用于分配和释放原始的未初始化的内存块,不涉及对象的构造和析构。因此,它们无法处理需要构造或析构的对象。 2. `delete` 与 `delete[]` 的区别: - 单独的 `delete` 运算符用于删除由 `new` 分配的单个对象。在释放内存前,它会调用该对象的析构函数。 - `delete[]` 用于删除由 `new[]` 分配的数组。它会依次调用数组中每个元素的析构函数,然后再释放整个内存块。这是为了确保所有对象都被正确地清理。 - 如果将一个数组指针传递给 `delete`,而不是 `delete[]`,则只会调用第一个元素的析构函数并释放首块内存,导致悬挂指针和内存泄漏。例如,以下代码会导致错误: ```cpp MemTest *mTest1 = new MemTest[10]; delete[] mTest1; // 正确 delete mTest1; // 错误,只析构第一个元素,其余内存未释放 ``` 3. C、C++与Java的共同点和不同之处: - 共同点:三者都是面向对象的语言,支持类和对象的概念,可以进行动态内存分配,并且都支持函数和循环等基本编程结构。 - 不同之处: - C++ 提供了模板(templates)、异常处理(exceptions)和多态性(polymorphism),而C语言则没有这些特性。 - C++ 支持运算符重载(operator overloading),C语言不支持。 - Java 是一种完全的面向对象语言,所有的代码都必须在类中,而C++允许全局函数和变量的存在。 - Java 有垃圾回收机制(garbage collection),自动管理内存,而C++和C需要程序员手动管理内存。 - Java 是跨平台的,通过JVM(Java虚拟机)运行,而C和C++需要针对特定平台进行编译。 理解这些知识点对准备C++面试至关重要,因为它们涉及到程序的内存管理和对象生命周期,这些都是编写高效、安全代码的基础。在实际编程中,正确使用 `new`、`delete`、`malloc` 和 `free` 能避免内存泄漏和悬挂指针等问题,而理解 `delete` 与 `delete[]` 的差异则能确保数组对象的正确销毁。对于C、C++与Java的比较,有助于理解不同语言的设计哲学和适用场景。