MST

星途 面试题库

面试题:C++ 中 delete 与 delete[] 在数组场景下的行为差异

假设你有一个动态分配的 int 类型数组 `int* arr = new int[10];`,请解释使用 `delete arr;` 和 `delete[] arr;` 分别会产生什么结果,以及为什么会有这样的结果。
44.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. delete arr;的结果及原因
    • 结果:这会导致未定义行为。
    • 原因delete arr; 用于释放单个动态分配的对象。然而,这里 arr 是通过 new int[10]; 分配的一个包含10个 int 元素的数组。当使用 delete arr; 时,它只释放 arr 指向的第一个 int 元素的内存空间,而数组中剩余9个 int 元素的内存空间并没有被释放,从而造成内存泄漏。同时,这种操作还可能破坏堆内存的管理结构,因为内存分配器期望使用与分配方式匹配的释放方式,即数组分配用 delete[] 释放,单个对象分配用 delete 释放,所以会导致未定义行为。
  2. delete[] arr;的结果及原因
    • 结果:会正确释放 arr 所指向的整个包含10个 int 元素的数组的内存空间,不会造成内存泄漏。
    • 原因delete[] 操作符专门用于释放通过 new[] 分配的数组内存。它会遍历数组中所有元素(在这个例子中是10个 int 元素),调用每个元素的析构函数(对于 int 类型,析构函数是平凡的,不执行额外操作),然后释放整个数组占用的内存空间,确保内存被正确回收,避免内存泄漏问题。