2017-07-14 48 views
0

我目前正在使用一個特定的API,因此我必須使用原始指針,但是考慮到指針的特定佈置,我不確定如何最好地去清除內存並避免任何未定義的行爲。取消分配這個特定的二維數組的內存

double *data1 = new double[rows*columns]; 
double **data2 = new double*[rows]; 
data2[0] = data1; // Point to first row 

for (int i = 1; i < columns; i++) { 
    data2[i] = data2[i - 1] + rows; 
} 

我試過類似下面的東西,但我不認爲它是正確的。

for(int i = 0; i < rows; i++) { 
    delete [] data2[i]; 
} 
delete [] data2; 
delete [] data1; 
+0

你有沒有考慮使用['標準:: VECTOR'(http://en.cppreference.com/w/cpp/container/vector)代替? –

+2

如果你有2個'new's,你應該有2個'delete's。你的例子有'rows + 2'刪除。基本上,請計算您擁有的新聞和刪除數量,最終應該是平等的。 –

+0

刪除的順序在這裏有什麼不同嗎? – Alexander

回答

0

誰擁有什麼?

問題在於如何刪除對象。

我認爲你正在做的是創建一個大數組來保存一個二維數據數組,然後創建另一個數組來保存指向每一行開頭的指針。

這是兩條新聞,因此兩條刪除。

可能更容易想象這樣的:

struct matrix_view 
{ 
    int rows, columns; 

    // this pointer owns a block of doubles 
    double* entire_buffer = nullptr; 

    // this pointer owns a block of pointers, but not the memory 
    // they point to 
    double** row_pointers = nullptr; 
}; 

matrix_view create_matrix(int rows, int columns) 
{ 
    auto result = matrix_view{ rows, columns, nullptr, nullptr }; 

    auto size = rows * columns; 
    result.entire_buffer = new double [size]; 
    result.row_pointers = new double* [rows]; 
    auto first = result.entire_buffer; 
    auto last = first + size; 
    auto dest = result.row_pointers; 
    while (first != last) { 
     *dest++ = first; 
     first += columns; 
    } 
    return result; 
} 

void destroy_matrix(matrix_view m) 
{ 
    // always destroy in reverse order 

    delete [] m.row_pointers; 
    delete [] m.entire_buffer; 
}