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

需积分: 3 101 下载量 61 浏览量 更新于2025-01-02 收藏 474KB DOCX 举报
"C/C++面试宝典包含华为、普天、大唐等企业面试中的C/C++相关题目,主要涉及动态内存管理、对象生命周期和继承等核心概念。" 1. new、delete、malloc、free关系 在C++中,new和delete是一对运算符,用于动态内存的分配和释放,同时处理对象的构造和析构。new在分配内存后会调用对象的构造函数,而delete在释放内存前会调用析构函数。相比之下,malloc和free是C语言标准库提供的函数,仅负责基本的内存分配和释放,不涉及对象的构造与析构。这意味着使用malloc和free无法对非内置类型(如类对象)进行初始化和清理工作。因此,C++引入了new和delete以支持对象生命周期的完整管理。 2. delete与delete[]的区别 delete和delete[]的主要区别在于处理数组对象的方式。delete仅调用一次析构函数,适用于释放单个对象的内存;而delete[]会依次调用数组中每个元素的析构函数,然后释放整个数组的内存。这适用于动态分配的数组。例如,当使用new[]分配内存时,应使用delete[]来释放,反之亦然。如果误用,可能导致只释放部分内存或调用析构函数次数错误,引发未定义行为。在示例代码中,-4-处的错误表明对于自定义类型,使用delete而非delete[]会导致只调用了第一个对象的析构函数,而其他对象的析构函数未被调用,内存未被正确释放。 3. C/C++与JAVA的共同点与不同之处 共同点: - 都支持面向对象编程,包括类、继承、封装和多态等特性。 - 都有丰富的库支持,可以编写复杂的系统级应用。 - 都使用编译型语言,需要编译后运行。 不同之处: - C++允许低级别内存操作,如指针,而Java则通过垃圾回收机制避免直接内存管理。 - Java具有平台无关性,通过JVM实现跨平台,而C++代码需要针对特定平台进行编译。 - C++支持函数重载和运算符重载,Java不支持运算符重载。 - C++有模板和多重继承,Java没有多重继承,但提供了接口作为替代。 - Java的异常处理比C++更规范,C++允许不捕获异常。 4. 继承的优缺点 优点: - 代码复用:通过继承父类,子类可以共享父类的属性和方法,减少代码重复。 - 多态性:继承支持子类对象替换父类对象,实现动态绑定,提高程序灵活性。 - 扩展性:可以轻松扩展已有类的功能,而不必修改原始代码(开放封闭原则)。 缺点: - 复杂性:过多的继承层次可能导致设计复杂,难以理解和维护。 - 性能影响:虚函数可能导致运行时性能下降,尤其是多继承情况下。 - 正确性挑战:不恰当的继承可能导致错误的抽象,子类可能承担不必要的责任。 - 限制设计:继承是静态的,一旦建立,难以更改,限制了设计的灵活性。 总结,C/C++面试宝典中的这些知识点涵盖了内存管理的基础和面向对象编程的核心概念,这些都是C/C++开发者必须掌握的关键技能。了解这些内容有助于准备面试,提升编程实践中的问题解决能力。