MST
星途 面试题库

面试题:C++ std::unique_ptr自定义删除器与资源管理优化

考虑一个场景,你需要使用std::unique_ptr管理一个动态分配的数组,并且希望在释放数组时执行特定的清理操作,如将数组中的所有元素设置为0后再释放内存。请实现这个功能,要求自定义删除器能够正确处理不同大小的数组,并且在性能上尽量优化。
27.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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;
}
  1. 自定义删除器 ArrayCleaner
    • 重载 () 运算符,使其能够像函数一样被调用。
    • 在删除指针之前,先将数组中的元素设置为0,然后再释放内存。这里假设数组的大小信息存储在数组的第一个元素(实际中可能需要更健壮的方式来获取数组大小,比如额外的变量记录等)。
  2. main 函数
    • 使用 std::unique_ptr 管理动态分配的数组,并指定 ArrayCleaner 作为删除器。
    • 给数组赋值,然后当 arr 离开作用域时,自定义删除器会自动调用,完成清理操作。

这样可以满足使用 std::unique_ptr 管理动态分配数组,并在释放时执行特定清理操作的需求,同时在性能上相对优化(仅在释放时额外遍历一次数组设置元素为0)。如果实际中数组大小有更合适的记录方式,代码可以进一步优化。