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

需积分: 9 2 下载量 175 浏览量 更新于2024-08-01 收藏 1012KB PDF 举报
"C++2009面试宝典" C++是一种强大且复杂的编程语言,尤其在面试中,深入理解其内存管理和对象生命周期是至关重要的。以下是对标题和描述中涉及知识点的详细解释: 1. **内存管理:new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,专门用于动态内存分配和释放,它们处理的对象不仅仅是内存,还会调用构造函数和析构函数以进行对象的初始化和清理。 - `malloc` 和 `free` 是C/C++标准库中的函数,仅用于原始字节的内存分配和释放,不涉及对象的构造与析构。因此,对于需要构造和析构的对象,直接使用 `malloc` 和 `free` 是不够的。 - `new` 会调用构造函数以初始化对象,`delete` 会调用析构函数以清理对象。而 `malloc` 只分配内存,`free` 只释放内存,它们不关注对象的生命周期。 2. **delete与delete[]的区别** - 当使用 `delete` 操作符时,只调用一次析构函数,适用于删除单个对象。如果删除的是数组,只调用首元素的析构函数,其他元素的析构函数不会被调用。 - 使用 `delete[]` 时,会为数组中的每个元素调用析构函数,然后释放整个数组的内存。这是为了解决数组对象的清理问题。 - `new[]` 和 `delete[]` 配对使用,`new` 和 `delete` 配对使用。如果误用,如将 `delete[]` 用于非数组对象,或 `delete` 用于数组对象,可能导致未定义的行为,如在示例代码的第4行所示的错误。 3. **C++与C、Java的共同点和不同点** - 共同点:C++、C和Java都是面向对象的编程语言,支持类、对象和封装的概念。它们都使用类似的语法结构,例如循环、条件语句等,并且都能实现高级的程序设计模式。 - 不同点: - C++支持模板、多重继承和运算符重载等特性,而C语言不支持。 - Java是完全的面向对象语言,没有全局变量和函数,所有的数据和行为都封装在类中。而C++和C允许全局变量和函数的存在。 - C++和C支持指针操作,Java则没有裸指针,而是使用引用和对象的句柄。 - C++提供了两种内存管理方式(堆和栈),C语言也是如此,而Java由垃圾回收机制自动管理内存。 - Java有平台无关性,其代码可以“一次编写,到处运行”,而C++和C的可移植性依赖于编译器和平台。 在准备C++面试时,掌握这些基础概念和细节是非常关键的。同时,理解内存泄漏、异常处理、STL(Standard Template Library)的使用、模板元编程等高级主题也是必不可少的。确保对C++标准库有深入的理解,并熟悉C++11及以后版本的新特性,例如智能指针、lambda表达式和右值引用,这些都会提升你的面试表现。