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

5星 · 超过95%的资源 需积分: 14 25 下载量 67 浏览量 更新于2024-09-09 1 收藏 93KB DOCX 举报
"《C++面试宝典2015版》是一本专注于C++面试的书籍,旨在帮助C++程序员准备面试,提供全面的C++语言和编程知识,包括内存管理、对象生命周期以及C++与C的区别等关键点。" 在C++编程中,内存管理是一个至关重要的主题,特别是在面试中经常被考察。以下是有关内存管理的一些关键知识点: 1. **new、delete、malloc、free关系**: - `new` 和 `delete` 是C++的运算符,用于动态内存分配和释放。`new` 在分配内存时会调用对象的构造函数,而 `delete` 在释放内存前会调用析构函数。这使得C++能够管理对象的生命周期。 - `malloc` 和 `free` 是C/C++标准库中的函数,仅负责分配和释放基本类型的数据,不涉及构造和析构。因此,对于包含构造函数和析构函数的对象,单纯使用 `malloc` 和 `free` 不足以为对象提供完整的生命周期管理。 2. **delete与delete[]的区别**: - 当使用 `delete` 操作符时,它只会调用单个对象的析构函数,释放该对象占用的内存。 - 使用 `delete[]` 时,它会为数组中的每个元素调用析构函数,然后释放整个数组所占的内存。这是为了确保数组中的所有对象都能正确地完成生命周期。 - 例如,对于动态分配的数组,如 `MemTest *mTest1 = new MemTest[10]`,应使用 `delete[] mTest1` 来释放内存。如果尝试用 `delete mTest1`,则只会调用第一个元素的析构函数,其余元素的析构函数不会被调用,可能导致内存泄漏或未定义行为。 3. **C和C++的共同点和不同之处**: - 共同点:两者都使用相同的语法基础,如变量声明、循环、条件语句等,都支持面向过程编程。 - 不同之处:C++是C的超集,增加了类、对象、模板、异常处理、STL(标准模板库)等特性,支持面向对象编程。此外,C++具有更严格的类型检查和资源管理机制,如构造函数、析构函数和智能指针。 4. **继承的优缺点**: - **优点**: - 代码重用:通过继承父类的属性和方法,子类可以避免重复编写相同的代码。 - 多态性:通过虚函数和接口实现,子类可以有不同的实现方式,增强了代码的灵活性。 - 扩展性:可以轻松添加新的功能,而不影响现有的代码结构。 - **缺点**: - 维护复杂度增加:多层继承可能导致代码难以理解和维护。 - 性能影响:虚函数可能导致运行时的性能下降,因为需要进行动态绑定。 - 抽象层次混淆:过度使用继承可能导致类的设计过于复杂,难以清晰地定义职责。 在面试中,理解这些核心概念是至关重要的,因为它们反映了C++程序员对语言特性和最佳实践的理解程度。同时,继承作为面向对象设计的基础之一,它的优缺点也是考察设计原则和模式理解的一部分。