2017-02-01 23 views
10

我是C++新手,來自C#。 下面是代碼:即使發生錯誤,C++刪除數組

void function(int n) 
{ 
    double* array = new double[n]; 

    //some work that can return or throw an exception 
    //... 

    delete[] array; 
    return; 
} 

我知道有沒有C#using等同於C++。

有沒有一個簡單而優雅的方式來確保內存將被釋放什麼事?

+6

是的。在「智能指針」上運行Google搜索。 –

+6

或更好的['std :: array'](http://en.cppreference.com/w/cpp/container/array)(或可能['std :: vector'](http://en.cppreference)的.com /瓦特/ CPP /容器/載體))。 –

+4

閱讀RAII成語,用於Rust和C++。 –

回答

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]

最後,如果你不需要ŧ O傳輸數據的所有權出來的功能,在編譯時知道數組的大小,規模不是太大,你也可以考慮具有直接數組對象:

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; 
} 
+0

'std :: valarray '也可能是有用的,這取決於要解決的具體問題。 – Andrew

+0

我認爲這將是很好的提及'std :: array'而不是原始數組。 –

+0

@GuillaumeRacicot:編譯時必須知道'std :: array'的大小,並且OP在運行時不知道大小(這隱藏在OP的評論中:「@人們回答:抱歉的誤導性的例子,在編譯時數組的大小不知道「) – AndyG

10

自動變量在的範圍的端部被破壞自動,無論是由於返回或投擲:

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

遺憾的誤導例如,陣列的大小不是在編譯時

已知

在這種情況下,您確實需要一個動態數組。處理動態內存等資源清理的流行解決方案是將指針(或者取決於資源類型的句柄或描述符)包裝到類中,在初始化時獲取資源並在銷燬時釋放資源。然後你可以創建這個包裝類型的自動變量。這種模式被稱爲「資源獲取初始化」或簡稱RAII。

但是,您不需要爲動態數組編寫自己的RAII包裝。標準庫包括:std::vector