free () заморозка в визуальной студии C - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблема с функцией free () в visual studio.Когда я вызываю функцию free (), чтобы освободить память, которую я использовал, консоль Visual Studio зависает.Я попытался скомпилировать тот же код с помощью компилятора gcc, и он прекрасно работает.

Вот пример из моего кода (язык C):

функция xorshift32:

  unsigned int* xorshift32(int size, int seed);
{
    unsigned int r, k;
    r = (unsigned int) seed;
    unsigned int* v = calloc(size, sizeof(int));
    v[0] = seed;
    for(k = 1; k<=size;k++)
{
        r = r ^ r << 13; 
        r = r ^ r >> 17;
        r = r ^ r << 5;
        v[k] = (unsigned int) r;
}
    return v;
}

вызов функции и свободной функции:

    unsigned int *random_sequence;
    random_sequence = xorshift32(rand_size, seed);
    free(random_sequence);

1 Ответ

0 голосов
/ 12 декабря 2018
for(k = 1; k<=size;k++)

Выделенная память действительна до индекса size - 1, но k может доходить до size;поэтому при записи в v{size] вы запускаете повреждение памяти.

Далее следует неопределенное поведение , и оно показывает при освобождении буфера (но это могло бы сделать что-то еще, даже если вв этих случаях происходит сбой прямо в строке, где вы перезаписываете память, или при следующей операции с памятью free или malloc из-за повреждения списка памяти.)

Лично я склонен избегатьусловия с худшим или равным тестом (k<=size;) в циклах for, потому что одноразовые ошибки просты.Лучше вычислить переменную с именем size_plus_one и использовать k < size_plus_one.

Выделить еще один элемент, чтобы исправить это:

unsigned int* v = calloc(size + 1, sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...