C++删除数组,即使发生错误也是如此

C++ delete array even if error occurs

本文关键字:错误 数组 删除 C++      更新时间:2023-10-16

我是C++新手,来自C#。这是代码:

void function(int n)
{
    double* array = new double[n];
   //some work that can return or throw an exception
   //...
   delete[] array;
   return;
}

我知道C++中没有等效的 C# using

有没有一种简单而优雅的方法来确保内存在发生时都会释放?

在C++中,代码如下所示:

#include <vector>
void function()
{
    std::vector<double> array(100);
    //some work that can return when or throw an exception
    //...
    return;
}

如果你真的不想初始化数组元素,不需要调整数组大小,也不需要迭代器,你也可以使用:

#include <memory>
void function()
{
    std::unique_ptr<double[]> array(new double[100]);
    //some work that can return when or throw an exception
    //...
    return;
}

在这两种情况下,您都可以使用 array[0]array[1] 等访问数组元素。

最后,如果你不需要将数据的所有权从函数中转移出去,在编译时知道数组的大小,并且大小不要太大,你也可以考虑有一个直接数组对象:

void function()
{
    double array[100];  // uninitialized, add " = {}" to zero-initialize
    // or:
    std::array<double, 100> array;  // ditto
    //some work that can return when or throw an exception
    //...
    return;
}

自动变量在作用域结束时自动销毁,无论是由于返回还是抛出:

{
    double array[100];
    throw 1; // no memory leaked
}

很抱歉提供误导性示例,编译时数组的大小未知

在这种情况下,您确实需要一个动态数组。处理资源清理(如动态内存)的一种流行解决方案是将指针(或句柄或描述符,取决于资源类型)包装在一个类中,该类在初始化时获取资源,并在销毁时释放。然后,您可以创建此包装器类型的自动变量。此模式称为"资源获取即初始化"或简称 RAII。

但是,您无需为动态数组编写自己的 RAII 包装器。标准库为您提供: std::vector