繁体   English   中英

二维数组释放

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM