C++面试必备:new、delete与malloc、free的区别及应用

需积分: 3 0 下载量 36 浏览量 更新于2024-07-26 收藏 571KB DOC 举报
"C++笔试题面试相关知识" 在C++编程中,理解和掌握动态内存管理是至关重要的。这里我们详细探讨一下标题和描述中提到的知识点。 首先,`new` 和 `delete` 是C++中的运算符,它们主要用于动态内存的分配和释放。与C语言中的 `malloc` 和 `free` 函数类似,但具有更高级的功能。`new` 在分配内存的同时会调用对象的构造函数,而 `delete` 在释放内存前会调用析构函数。这是因为C++支持面向对象特性,需要在对象生命周期的开始和结束时执行特定的操作。`malloc` 和 `free` 只负责基本的内存分配和回收,不涉及对象的构造和析构过程,所以对于非内置类型的数据,单纯使用这两个函数是不够的。 接着,`new[]` 和 `delete[]` 的使用是针对数组对象的。`new[]` 分配一个对象数组,并为每个元素调用构造函数,`delete[]` 则会先对每个元素调用析构函数,然后释放整个数组的内存。这与单个对象的 `new` 和 `delete` 有所不同,后者只处理单个对象,不会遍历数组调用析构函数。例如: ```cpp MemTest *mTest1 = new MemTest[10]; // 使用new[]分配数组 MemTest *mTest2 = new MemTest; // 使用new分配单个对象 // 正确使用delete[]和delete delete[] mTest1; // 释放数组内存,调用所有元素的析构函数 delete mTest2; // 释放单个对象内存,调用析构函数 // 错误用法示例,会导致未定义行为 delete[] mTest2; // 不正确,mTest2是一个单个对象,应使用delete delete mTest1; // 不正确,mTest1是一个数组,应使用delete[] ``` 在上述代码中,第4行(`delete[] mTest2;`)会导致错误,因为 `mTest2` 指向的是单个对象而非数组,应当使用 `delete` 而非 `delete[]`。 至于C++、C和Java之间的共同点和不同之处,这是一个广泛的话题。简单来说,C++是C的超集,它增加了类、模板、异常处理等面向对象特性;Java则是一种完全不同的语言,具有垃圾回收机制、跨平台特性,以及强类型系统。C++允许更低级别的内存操作,而Java和C#等语言倾向于提供更安全的环境,牺牲了一些灵活性。 继承是面向对象编程中的一个重要概念,它的优点包括代码重用、多态性和接口扩展。通过继承,子类可以继承父类的属性和方法,减少代码重复,提高效率。多态性使得子类对象可以被当作父类对象处理,增强了程序的灵活性。然而,继承也存在缺点,比如增加了类之间的耦合度,可能导致代码维护困难,以及“菱形继承”问题(多重继承时的二义性)。 总结来说,C++中的动态内存管理需要谨慎对待,特别是 `new`、`delete`、`new[]` 和 `delete[]` 的正确使用。同时,理解继承在面向对象编程中的作用和潜在问题也是很重要的。这些知识点是C++程序员面试时常见的考查点。