C++面试必备:new、delete、malloc、free的区别

需积分: 3 2 下载量 124 浏览量 更新于2024-07-30 1 收藏 81KB DOC 举报
C++面试宝典 C++是一门功能强大的编程语言,它提供了多种方式来管理动态内存。了解C++中的内存管理机制是非常重要的,特别是在面试中。本文将对C++中的内存管理机制进行详细讲解,并提供了一些常见的面试题目。 一、新、delete、malloc、free关系 在C++中,有多种方式来管理动态内存。其中,new和delete是C++中的运算符,malloc和free是C语言的标准库函数。 1. delete会调用对象的析构函数,new调用构造函数。malloc申请内存空间,free只会释放内存。 2. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。 3. 它们都可用于申请动态内存和释放内存。 4. 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。 5. 对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。 二、delete与delete[]区别 delete和delete[]是C++中的两个不同的运算符,它们的作用域和使用场景不同。 1. delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。 2. delete与New配套,delete[]与new[]配套。 例如: MemTest* mTest1 = new MemTest[10]; MemTest* mTest2 = new MemTest; int* pInt1 = new int[10]; int* pInt2 = new int; delete[] pInt1; //-1- delete[] pInt2; //-2- 报错,要使用delete delete[] mTest1; //-3- delete[] mTest2; //-4- 报错,使用delete 这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。简单来说,用new分配的内存,用delete删除;用new[]分配的内存,用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。 C++中的内存管理机制非常复杂,需要我们细心地理解和掌握。只有掌握了这些知识点,我们才能更好地编写C++程序。