C++动态内存管理:new、delete与malloc、free的区别

需积分: 4 0 下载量 78 浏览量 更新于2024-07-20 收藏 747KB PDF 举报
"C、C++笔试面试宝典2010版" 在C++编程中,内存管理是一项关键技能,特别是在面试和笔试中,这部分知识经常被考察。本篇文章将详细解析C++中的`new`、`delete`、`malloc`、`free`之间的关系,以及`delete`和`delete[]`的区别,并简要提及C、C++与Java在内存管理上的共同点和不同之处。 1. `new`、`delete`、`malloc`、`free`的关系: - `new`和`delete`是C++中的运算符,用于动态内存分配和释放。它们不仅分配或释放内存,还能对对象进行构造和析构。当使用`new`创建对象时,会调用对象的构造函数;当使用`delete`删除对象时,会调用析构函数。`new`和`delete`是C++标准的一部分,它们的行为受到编译器的控制。 - 相反,`malloc`和`free`是C/C++的标准库函数,仅用于基本内存操作。`malloc`分配内存,`free`释放内存。它们不涉及对象的构造和析构,因此不适合处理包含构造函数和析构函数的对象。 2. `delete`与`delete[]`的区别: - 单个对象:`delete`仅调用一次析构函数并释放内存。适用于通过`new`单独分配的非数组对象。 - 数组对象:`delete[]`则为数组中的每个元素调用析构函数,然后释放整个内存块。它与`new[]`配套使用,适用于通过`new[]`动态分配的数组。 举例说明: ```cpp MemTest*mTest1 = new MemTest[10]; // 动态分配数组 MemTest*mTest2 = new MemTest; // 动态分配单个对象 int*pInt1 = new int[10]; // 动态分配整型数组 int*pInt2 = new int; // 动态分配单个整数 delete[] pInt1; // 正确,调用所有元素的析构函数 delete[] pInt2; // 错误,pInt2是一个单个对象,应使用delete delete[] mTest1; // 正确,调用数组中每个对象的析构函数 delete[] mTest2; // 错误,mTest2是单个对象,应使用delete ``` 如果使用`delete[]`删除单个对象,或者使用`delete`删除数组,可能会导致未定义的行为,如上述示例中的第4行所示。 3. C、C++、Java内存管理的共同点与不同: - 共同点:这三种语言都支持动态内存分配。C++的`new`和`delete`、C的`malloc`和`free`以及Java的`new`和垃圾回收机制都可以实现内存的动态分配和释放。 - 不同点:C++和C允许程序员直接管理内存,而Java采用自动垃圾回收机制,程序员通常不需要手动释放内存。C++中的`new`和`delete`提供了构造和析构功能,而C的`malloc`和`free`没有这些功能。Java的内存管理由虚拟机自动完成,更安全但可能有性能影响,因为垃圾回收可能导致暂停。 在实际编程中,理解这些概念和规则至关重要,不仅可以避免内存泄漏和悬挂指针等常见错误,也有助于优化程序性能和提高代码质量。在面试和笔试中,熟练掌握这些知识点能帮助你更好地应对相关问题。