二维数组释放

时间:2012-04-19 01:13:34

标签: c++ arrays visual-studio-2010 pointers multidimensional-array

作为介绍,我在Visual Studio 2010中使用C ++,为x64编译。我有一个程序,它使用2维数组存储数据,以便通过我无法控制的C风格函数运行:

float **results;
results = new float*[rows];
for (int i = 0; i < rows; ++i){
    results[i] = new float[columns];
}

int **data;
data = new int*[rows];
for (int i = 0; i < rows; ++i){
    data[i] = new int[columns];
}

//send data to the function and populate results with values
ExternalFunction(*data, *results);

//delete everything
for (int i = 0; i < rows-1; ++i){
    delete [] &results[i];
    delete [] &data[i];
}
delete [] results;
delete [] data;

这导致VS10通过_BLOCK_TYPE_IS_VALID(pHead - &gt; nBlockUse)通过调试断言失败。无论在包含删除的最后几行中发生了什么,都会在程序结束时发生这种情况。这究竟是什么意思?我究竟做错了什么?我觉得这很简单,但我一直在看这段代码。

- 编辑--- 由于dasblinkenlight对我的大脑很有帮助,问题解决了!

float *results = new float[rows * columns];
float *data = new float[rows * columns];

ExternalFunction(&data[0], &results[0]);

delete [] results;
delete [] data;

2 个答案:

答案 0 :(得分:2)

您的代码崩溃是因为您将地址的地址传递给delete[],这不是您分配的地址。将您的代码更改为:

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

它不会再崩溃。

关于此的规则很简单:既然您已将new[..]的结果分配给results[i],那么您应该将results[i]而不是&results[i]传递给delete [] }。同样适用于data

另请注意,此代码会删除您分配的所有行,包括最后一行(循环条件现在为i < n,而不是i < n-1)。谢谢bjhend!

答案 1 :(得分:0)

您可以将以下用作预定行数的2D数组的宏或某些删除功能:

for_each(results, results + rows , [](int* row) { delete[] row; });
delete[] results;