3

作为介绍,我在 Visual Studio 2010 中使用 C++,为 x64 编译。我有一个程序使用二维数组来存储数据,以便通过我无法控制的 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 -> nBlockUse) 的调试断言失败。这发生在程序结束时,无论在包含删除的最后几行中实际发生了什么。这到底是什么意思?我究竟做错了什么?我觉得它真的很简单,但是我一直在看这个代码太久了。

--EDIT--- 由于 dasblinkenlight 对我的大脑的帮助,问题得以解决!

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

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

delete [] results;
delete [] data;
4

2 回答 2

2

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

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

它不会再崩溃了。

这方面的规则很简单:由于您将结果分配给new[..]to results[i],因此您应该传递results[i],而不是&results[i]to delete []。也一样data

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

于 2012-04-19T01:39:12.973 回答
0

您可以将以下用作宏或某些删除函数,用于预定义行数的二维数组:

for_each(results, results + rows , [](int* row) { delete[] row; });
delete[] results;
于 2016-07-19T10:01:57.867 回答