Сообщение Re[4]: И снова пишем программы с ИИ от 25.02.2025 8:36
Изменено 25.02.2025 8:37 temnik
I>Здравствуйте, falcoware, Вы писали:
F>>Dec 10, 2023 — Новый размер в байтах. Возвращаемое значение. realloc возвращает указатель void в перераспределенном (и, возможно, перемещенном) блоке памяти.
I>до этой строчки не дойдет, потому что он после ресайза еще и копирование запустил
I>и это не случайная ошибка — ими весь код усеян
I>хорошо что я это понимаю, а если бы это был незнакомый мне язык?
Мы же не знаем, что и как ты попросил ее сделать. Я попросил проанализировать Qwen этот код на ошибки, он среди прочего нашел такие —
Утечка памяти при ошибке realloc:
Если realloc возвращает NULL, старый массив result все еще остается доступным, но после вызова free(result) он удаляется.
Однако, если realloc успешен, адрес старого массива заменяется новым адресом, и старая память автоматически освобождается.
Чтобы избежать путаницы, можно сохранить старый адрес перед вызовом realloc:
float* temp = (float*)realloc(result, (end_index — start_index) * sizeof(float));
if (temp == NULL) {
printf("Memory reallocation failed.\n");
return NULL; // Старый массив остается нетронутым
}
filtered_result = temp;
Необходимость явного указания размера массива result:
В коде не указано, как определить размер массива result. Это может привести к проблемам, если start_index или end_index выходят за пределы массива.
Рекомендуется передавать размер массива как дополнительный параметр функции.
Использование realloc вместо malloc:
Если result был создан не с помощью malloc или calloc, а, например, как локальный массив, использование realloc может привести к ошибке.
I>Здравствуйте, falcoware, Вы писали:
F>>Dec 10, 2023 — Новый размер в байтах. Возвращаемое значение. realloc возвращает указатель void в перераспределенном (и, возможно, перемещенном) блоке памяти.
I>до этой строчки не дойдет, потому что он после ресайза еще и копирование запустил
I>и это не случайная ошибка — ими весь код усеян
I>хорошо что я это понимаю, а если бы это был незнакомый мне язык?
Мы же не знаем, что и как ты попросил ее сделать. Я попросил проанализировать Qwen этот код на ошибки, она среди прочего нашла такие —
Утечка памяти при ошибке realloc:
Если realloc возвращает NULL, старый массив result все еще остается доступным, но после вызова free(result) он удаляется.
Однако, если realloc успешен, адрес старого массива заменяется новым адресом, и старая память автоматически освобождается.
Чтобы избежать путаницы, можно сохранить старый адрес перед вызовом realloc:
float* temp = (float*)realloc(result, (end_index — start_index) * sizeof(float));
if (temp == NULL) {
printf("Memory reallocation failed.\n");
return NULL; // Старый массив остается нетронутым
}
filtered_result = temp;
Необходимость явного указания размера массива result:
В коде не указано, как определить размер массива result. Это может привести к проблемам, если start_index или end_index выходят за пределы массива.
Рекомендуется передавать размер массива как дополнительный параметр функции.
Использование realloc вместо malloc:
Если result был создан не с помощью malloc или calloc, а, например, как локальный массив, использование realloc может привести к ошибке.