международная матрица с указателями в C - беспорядок выделения памяти

Использовать третью сторону dateutil library:

from dateutil import parser
dt = parser.parse("Aug 28 1999 12:00AM")

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

Это очень полезно для написания тестов, где читаемость важнее производительности.

Вы можете установить его с:

pip install python-dateutil

6
задан Fredrik 19 September 2008 в 21:11
поделиться

7 ответов

Просто, потому что память была free'd, не означает, что Вы не можете получить доступ к нему! Конечно, это - очень плохая идея получить доступ к нему после того, как это был free'd, но вот почему это работает в Вашем примере.

Отметьте это free( *first_matrix ) только free's first_matrix[0], не другие массивы. Вы, вероятно, хотите, чтобы некоторый маркер показал последний массив (если Вы не будете всегда знать при освобождении внешнего массива, сколько внутренних массивов Вы выделили). Что-то как:

int** read_matrix(int size_x, int size_y)
{
    int** matrix;
    matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
    for(int i = 0;i<size_x;i++) {
        matrix[i] = calloc(size_y, sizeof(int));
    }
    matrix[size_x] = NULL; // set the extra ptr to NULL
    for(int i = 0;i<size_x;i++) {
        for(int j = 0;j<size_y;j++) {
            matrix[i][j] = i*10+j;
        }
    }
    return matrix;
}

Затем, когда Вы освобождаете их:

// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
    free( first_matrix[i] );
}
free( first_matrix );
9
ответ дан 9 December 2019 в 20:51
поделиться

Необходимо освободить каждую строку индивидуально:


void free_matrix(int **matrix, int size_x)
{
    for(int i = 0; i < size_x; i++)
        free(matrix[i]);
    free(matrix);
}
2
ответ дан 9 December 2019 в 20:51
поделиться

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

Кроме того, Вы не освобождаете все, что Вы выделили. Вы только освобождаете массив указателей и первой строки. Но даже если бы Вы освобождаете все правильно, Вы все еще имели бы тот же эффект.

Если Вы хотите создать "ошибку шины", необходимо указать на память, которая не принадлежит процессу. Почему Вы хотите сделать это так или иначе?

1
ответ дан 9 December 2019 в 20:51
поделиться

Я рекомендую использовать valgrind для разыскивания unfree'd памяти, в противоположность попытке заставить ошибку шины произойти. Это качается для большого количества другого материала также.

Sam

0
ответ дан 9 December 2019 в 20:51
поделиться

Вы только освободили первую строку (или столбец) first_matrix. Запишите другую функцию как это:

void free_matrix(int **matrix, int rows)
{
    int i;
    for(i=0; i<rows; i++)
    {
        free(matrix[i]);
    }
    free(matrix);
}

Вы могли бы хотеть превратить матрицу в структуру для хранения, это - строка и количество столбцов.

0
ответ дан 9 December 2019 в 20:51
поделиться

Вы получаете утечки памяти, потому что Вы освобождаете первую строку матрицы и список строк, но ни один из 1 к энным строкам. Необходимо назвать свободным в цикле.

Существует несколько альтернатив, однако: - выделяют sizeof (интервал*) строки + rowscols*sizeof (международные) байты и используют первые байты для указателей строки. Тем путем у Вас только есть единственный блок памяти к свободному (и это легче на средстве выделения, также) - Использование структура, которая содержит количество строк. Затем можно избежать списка строк в целом (сохраняющий память). Единственный недостаток - то, что необходимо использовать функцию, макрос или некоторую грязную нотацию для обращения к матрице.

Если Вы идете со второй опцией, можно использовать структуру как это в любом компиляторе C99 и снова только иметь для выделения единственного блока памяти (размера numints*sizeof (интервал) +sizeof (интервал)):

struct matrix {
    int rows;
    int data[0];
}
0
ответ дан 9 December 2019 в 20:51
поделиться

Понятие, которое Вы пропускаете здесь, то, что для каждого calloc, должно быть свободное. и настолько свободный должен быть применен к указателю, пасуемому назад от calloc.

Я рекомендую создать функцию (названный delete_matrix), который использует цикл для освобождения всех указателей, в которых Вы выделяете здесь

для (интервал i = 0; я <size_x; я ++) {матрица [я] = calloc (size_y, sizeof (интервал));}

затем, после того как это сделано, освободите указатель, выделенный этим.

матрица = calloc (size_x, sizeof (интервал*));

Путем Вы делаете его теперь,

свободный (*first_matrix); свободный (first_matrix);

не сделает то, что Вы хотите, чтобы это сделало.

0
ответ дан 9 December 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: