Не могу свободной памяти - PullRequest
2 голосов
/ 02 апреля 2010

В коде:

  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 ]

3 голосов
/ 02 апреля 2010

Вы пишете после конца буфера, потому что буфер слишком мал.

T* columns = new T[col];

должно быть

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

Запись за концом буфера - неопределенное поведение - в вашем случае это повреждение кучи, потому что вы перезаписываете некоторые служебные данные, необходимые для работы кучи, и поэтому delete[] завершается неудачей.

0 голосов
/ 02 апреля 2010

Вы инициализируете columns как new T[col]. Затем вы увеличиваете столбцы во внутреннем цикле, который получает время выполнения строки col * - если только rows==1, вы увеличиваете столбцы после конца выделенного массива, вызывая неопределенное поведение.


Обратите внимание, что даже после того, как вы это исправите, ваша функция все еще очень неправильная - у нее нет ни возвращаемого значения, ни побочных эффектов. Это должен быть неоперативный. Это определенно не инвертирует свой параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...