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