MST

星途 面试题库

面试题:C++ 动态数组的异常安全

假设你正在编写一个函数,该函数内部创建一个动态数组,并且函数可能会抛出异常。请给出一个保证异常安全的实现方案,确保在异常发生时不会导致内存泄漏。
43.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

在C++ 中,可以使用智能指针来确保异常安全,避免内存泄漏。以下是一个示例代码:

#include <memory>
#include <vector>

std::vector<int> createDynamicArray() {
    // 使用std::unique_ptr来管理动态分配的数组
    std::unique_ptr<int[]> dynamicArray(new int[10]); 

    // 模拟可能抛出异常的操作
    if (/* 某些条件 */) {
        throw std::runtime_error("Exception occurred");
    }

    // 将动态数组的数据转移到std::vector中
    std::vector<int> result(dynamicArray.get(), dynamicArray.get() + 10);

    // 释放unique_ptr对数组的控制权
    dynamicArray.release(); 

    return result;
}

在上述代码中:

  1. 使用std::unique_ptr<int[]>来管理动态分配的数组new int[10],这样在unique_ptr的作用域结束时,会自动释放其所管理的内存,即使发生异常也能保证内存不会泄漏。
  2. 可以在函数中进行各种操作,若发生异常,unique_ptr会自动释放其管理的内存。
  3. 最后,将unique_ptr管理的数组数据转移到std::vector中,std::vector会接管数据的所有权,并负责其内存管理。

如果使用C++17及以上版本,还可以使用std::make_unique来创建unique_ptr,代码如下:

#include <memory>
#include <vector>

std::vector<int> createDynamicArray() {
    // 使用std::make_unique来创建unique_ptr
    auto dynamicArray = std::make_unique<int[]>(10); 

    // 模拟可能抛出异常的操作
    if (/* 某些条件 */) {
        throw std::runtime_error("Exception occurred");
    }

    // 将动态数组的数据转移到std::vector中
    std::vector<int> result(dynamicArray.get(), dynamicArray.get() + 10);

    // 释放unique_ptr对数组的控制权
    dynamicArray.release(); 

    return result;
}

这种方式更加简洁和安全,std::make_unique会直接分配所需的内存并创建unique_ptr,减少了潜在的内存泄漏风险。