无法释放记忆

时间:2010-04-02 09:47:25

标签: c++ pointers

在代码中:

  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;
}

我观察到,在迭代时,变量列的值等于零,我认为这就是问题 谢谢你的帮助。

P.S。我已经粘贴了这个fnc的最终版本。它现在按预期工作。谢谢大家的宝贵帮助。

2 个答案:

答案 0 :(得分:3)

由于缓冲区太小,您写入缓冲区末尾。

T* columns = new T[col];

应该是

T* columns = new T[col*row];

写入缓冲区末尾是未定义的行为 - 在您的情况下,它是堆损坏,因为您覆盖了一些对堆功能必不可少的服务数据,因此delete[]失败。

答案 1 :(得分:0)

您将columns初始化为new T[col]。然后在内循环中增加列,这将获得执行col *行时间 - 除非rows==1,否则将列增加到已分配的数组的末尾,从而导致未定义的行为。


请注意,即使你修复了它,你的功能仍然非常错误 - 它既没有返回值也没有副作用。它应该是一个无操作。它肯定不会反转它的参数。