即使发生错误,C ++也会删除数组

时间:2017-02-01 14:01:09

标签: c++ arrays memory-management

我是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等价物。

是否有一种简单而优雅的方法可以确保释放内存?

2 个答案:

答案 0 :(得分:13)

在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;
}

答案 1 :(得分:10)

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

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

抱歉这个误导性的例子,在编译时不知道数组的大小

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

但是,您不需要为动态数组编写自己的RAII包装器。您可以使用标准库:std::vector