C++2009面试必备:new、delete与malloc、free的区别及数组处理

需积分: 3 2 下载量 37 浏览量 更新于2024-08-01 收藏 596KB DOC 举报
"C++2009笔试面试宝典提供了关于C++编程语言的重要知识点,主要涉及内存管理和对象生命周期管理,以及C++与其他语言的对比和继承的概念。" 在C++编程中,内存管理和对象生命周期的正确管理是至关重要的。这里有两个核心概念:`new`和`delete`,以及C语言中的`malloc`和`free`。 1. `new`、`delete`、`malloc`、`free`的关系: - `new`和`delete`是C++的运算符,专门用于动态内存的分配和释放,并且在分配内存时可以调用构造函数,在释放内存前调用析构函数。这使得它们特别适合处理包含构造和析构过程的对象。 - `malloc`和`free`是C++/C语言的标准库函数,只负责动态内存的分配和释放,不处理对象的构造和析构,因此适用于基本数据类型或不需特殊初始化的内存区域。 2. `delete`与`delete[]`的区别: - 当使用`delete`释放内存时,只会调用单个对象的析构函数。如果释放的是一个对象数组,只调用一次析构函数,不会对数组中的每个元素分别调用。 - 相反,`delete[]`用于释放通过`new[]`分配的内存,它会为数组中的每个元素调用析构函数,然后释放整个内存块。这对于包含复杂对象的数组至关重要,因为每个对象可能需要进行自己的清理工作。 - 示例中,`mTest1`和`pInt1`是对象数组,应使用`delete[]`释放。而`mTest2`和`pInt2`是单个对象,使用`delete`即可。错误地使用`delete[]`尝试释放单个对象会导致未定义的行为,就像在示例的第4行所示。 3. C++、C、Java的共同点和不同之处: - 共同点:都是面向对象的语言(C++和Java),支持结构化编程,都使用变量、函数、循环和条件语句等基本编程结构。 - 不同之处:C++是静态类型的,允许模板和多态,同时支持过程式和面向对象编程。Java也是静态类型的,但它的内存管理是自动的(通过垃圾回收机制),并且是跨平台的。C语言是静态类型的,更注重底层控制,没有内置的面向对象特性,内存管理需要程序员手动处理。 4. 继承的优缺点: - 优点:继承允许代码重用,减少重复编写。子类可以从基类继承属性和行为,实现多态性,使代码结构更清晰,易于扩展和维护。继承还支持接口的实现,有助于设计模式的应用。 - 缺点:过深的继承层次可能导致复杂性增加,难以理解和调试。可能出现菱形继承问题,即一个子类同时继承两个或更多具有共同基类的父类,可能导致二义性。此外,如果基类的设计不够稳定,修改可能会对所有子类产生影响,导致大量的代码更改。 C++中的内存管理是通过`new`、`delete`、`new[]`和`delete[]`来实现的,这些操作符考虑了对象生命周期的完整过程。理解这些概念对于写出高效、安全的C++代码至关重要。同时,了解C++与其他语言的异同,以及继承的优缺点,可以帮助开发者更好地选择和利用各种语言特性。