腾讯C/C++面试题解析:new、delete与malloc、free的区别

1星 需积分: 50 154 下载量 56 浏览量 更新于2024-09-08 11 收藏 28KB DOCX 举报
"腾讯C、C++最新面试题库,包含内部面试问题及手写代码环节,重点关注new、delete、malloc、free之间的关系,delete与delete[]的区别,以及C++的面向对象特性等核心知识点。" 在C++编程中,理解和掌握动态内存管理是至关重要的。以下是针对提供的部分内容的详细解释: 1. new、delete、malloc、free关系: - `new` 和 `delete` 是C++中的运算符,它们不仅分配和释放内存,还会调用对象的构造函数和析构函数,确保对象的生命周期得到妥善管理。而 `malloc` 和 `free` 是C/C++标准库中的函数,只负责分配和回收内存,不涉及对象生命周期的管理。 - 当使用 `new` 创建对象时,如果对象是类类型,会调用对应的构造函数初始化对象。同样,使用 `delete` 时,会调用析构函数清理资源。相比之下,`malloc` 和 `free` 仅适用于原始数据类型,因为它们不处理对象的构造和析构。 2. delete与delete[]的区别: - 当使用 `delete` 操作符释放通过 `new` 分配的单个对象时,只会调用一次析构函数。而对于通过 `new[]` 分配的数组,`delete[]` 会遍历整个数组,依次调用每个元素的析构函数,最后释放内存。这是因为在C++中,数组元素可能包含需要清理的资源,如类对象。 - 示例代码中,`pInt1` 和 `pInt2` 分别是通过 `new[]` 分配的整型数组和单个整型对象,因此应该使用 `delete[]` 释放。`mTest1` 和 `mTest2` 类似,但 `mTest1` 是对象数组,所以需要 `delete[]`,而 `mTest2` 是单个对象,只需 `delete`。错误地使用 `delete[]` 删除单个对象会导致未定义行为,如示例中的第4行所示。 3. C++的面向对象特性: - 封装:它是面向对象编程的基础,通过将数据和操作数据的方法封装在一个类中,隐藏实现细节,提供公共接口与外界交互。 - 继承:允许创建一个新类(子类)作为现有类(父类)的扩展,子类可以继承父类的属性和方法,并可添加新的特性或重写已有特性。 - 多态:多态性使得不同的对象对同一消息作出不同的响应,这在运行时通过虚函数和抽象基类实现,增强了代码的灵活性和可扩展性。 这些知识点在腾讯的C、C++面试中至关重要,因为它们涉及到C++的核心概念和最佳实践。对于面试者来说,不仅需要理解这些概念,还要能够熟练运用它们解决实际编程问题。熟悉这些知识点将有助于在面试中表现出色,展示出扎实的C++基础和良好的编程素养。