作为介绍,我在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;
答案 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;