[英]2-Dimensional array deallocation
作为介绍,我在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 - > nBlockUse)通过调试断言失败。 无论在包含删除的最后几行中发生了什么,都会在程序结束时发生这种情况。 这究竟是什么意思? 我究竟做错了什么? 我觉得它很简单,但我一直在看这段代码太久了。
--EDIT ---由于dasblinkenlight对我大脑的有益推动,问题解决了!
float *results = new float[rows * columns];
float *data = new float[rows * columns];
ExternalFunction(&data[0], &results[0]);
delete [] results;
delete [] data;
您的代码崩溃是因为您要传递地址的地址以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!
你可以使用下面作为宏或一些删除函数的2D数组预定义行数:
for_each(results, results + rows , [](int* row) { delete[] row; });
delete[] results;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.