在代码中:
template<class T,int row, int col>
void invert(T (&a)[row][col])
{
T* columns = new T[col * row];
T* const free_me = columns;
T** addresses = new T*[col * row];
T** const free_me_1 = addresses;
/*cpy addresses*/
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
*addresses = &a[i][j];
++addresses;
}
}
addresses = free_me_1;
/*cpy every column*/
for (int i = 0; i < col; ++i)
{
for (int j = 0; j < row; ++j)
{
*columns = a[j][i];
++columns;
}
}
columns = free_me;
/*cpy from columns to addresses*/
for (int i = 0; i < (col * row); ++i)
{
*addresses[i] = columns[i];
}
delete[] free_me_1;
delete[] free_me;
}
我观察到,在迭代时,变量列的值等于零,这就是问题所在。
谢谢你的帮助。
附言我已经粘贴了该fnc的最终版本。现在可以正常工作了。谢谢大家的宝贵帮助。
最佳答案
由于缓冲区太小,您在缓冲区末端写了字。
T* columns = new T[col];
应该
T* columns = new T[col*row];
在缓冲区末尾写操作是未定义的行为-在您的情况下,这是堆损坏,因为您覆盖了一些对于堆功能必不可少的服务数据,因此
delete[]
失败。关于c++ - 无法释放内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2565982/