2017-07-14 52 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; 
}