面试题答案
一键面试#include <iostream>
#include <memory>
// 自定义删除器
struct ArrayCleaner {
void operator()(int* ptr) const {
if (ptr) {
// 假设数组大小存储在第一个元素(仅为示例,实际可能需要其他方式获取大小)
int size = *ptr;
for (int i = 1; i <= size; ++i) {
ptr[i] = 0;
}
delete[] ptr;
}
}
};
int main() {
// 使用std::unique_ptr管理动态分配的数组,并使用自定义删除器
std::unique_ptr<int, ArrayCleaner> arr(new int[5 + 1]());
// 假设数组第一个元素存储数组大小
arr[0] = 5;
for (int i = 1; i <= arr[0]; ++i) {
arr[i] = i;
}
// 当arr离开作用域时,自定义删除器会执行清理操作
return 0;
}
- 自定义删除器
ArrayCleaner
:- 重载
()
运算符,使其能够像函数一样被调用。 - 在删除指针之前,先将数组中的元素设置为0,然后再释放内存。这里假设数组的大小信息存储在数组的第一个元素(实际中可能需要更健壮的方式来获取数组大小,比如额外的变量记录等)。
- 重载
main
函数:- 使用
std::unique_ptr
管理动态分配的数组,并指定ArrayCleaner
作为删除器。 - 给数组赋值,然后当
arr
离开作用域时,自定义删除器会自动调用,完成清理操作。
- 使用
这样可以满足使用 std::unique_ptr
管理动态分配数组,并在释放时执行特定清理操作的需求,同时在性能上相对优化(仅在释放时额外遍历一次数组设置元素为0)。如果实际中数组大小有更合适的记录方式,代码可以进一步优化。