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

4星 · 超过85%的资源 需积分: 4 3 下载量 15 浏览量 更新于2024-07-26 收藏 747KB PDF 举报
"C、C++笔试面试宝典2010版" 在C++编程中,内存管理是非常关键的一部分,特别是在面试和笔试中,这部分知识经常被考察。以下是关于C++内存管理的一些重要知识点: 1. **new、delete、malloc、free的关系** - `new` 和 `delete` 是C++中的运算符,主要用于动态内存分配和释放。它们不仅分配或回收内存,还会调用对象的构造函数和析构函数,确保对象的生命周期得以正确管理。 - `malloc` 和 `free` 是C/C++标准库中的函数,仅负责分配和释放内存,不涉及对象的构造和析构。因此,它们适用于原始数据类型的动态内存操作,但不适用于包含构造和析构函数的复杂对象。 2. **delete与delete[]的区别** - 单个对象的删除:`delete` 只会调用一次析构函数,然后释放内存。例如: ```cpp MemTest *mTest2 = new MemTest; delete mTest2; // 调用一次析构函数 ``` - 数组对象的删除:`delete[]` 会为数组中的每个元素调用析构函数,然后释放内存。例如: ```cpp MemTest *mTest1 = new MemTest[10]; delete[] mTest1; // 调用10次析构函数 ``` - 如果误用 `delete` 删除了由 `new[]` 分配的内存,或者反之,可能会导致内存泄漏或未定义行为,因为析构函数的调用次数不对。 3. **C、C++与JAVA的共同点和不同之处** - 共同点:这三种语言都支持动态内存分配,都有类似的概念如指针(C++和C)和引用(JAVA),并且都允许程序员直接管理内存。 - 不同点: - C++和C提供了`new`和`delete`,而JAVA使用`new`和垃圾回收机制(Garbage Collector)自动管理内存,程序员不需要手动释放内存。 - C++允许运算符重载,可以自定义`new`和`delete`的行为,而C和JAVA不支持。 - JAVA的所有对象都是通过类实例化的,因此所有对象分配都使用`new`,而C++和C可以对原始数据类型使用`malloc`和`calloc`。 - 在JAVA中,数组的删除总是使用`delete[]`等价的操作,因为JAVA不直接暴露指针,而是使用引用来访问数组。 理解这些概念对于成为一名合格的C++开发者至关重要,因为在实际编程中,良好的内存管理能够避免许多潜在的问题,如内存泄漏和悬挂指针。同时,这些知识也是面试中常见的考点,能够体现开发者对语言特性的理解和应用能力。