in ntdll!RtlIsZeroMemory () from C:\WINDOWS\SYSTEM32\ntdll.dll
и я нашёл где именно:
else if (n_new_size < n_old_size && Campus) {
diff = n_old_size - n_new_size;
void* p_new = ((char*)Campus) + n_new_size;
memset(p_new, 0, diff);// в этой строке происходит ошибка
}
в чём смысл этих строк:
если новый размер динамического массива структур меньше чем старый (то есть был он сначала размера 1440 (10 структур) и стал 720 (теперь структур 5)), то ту область памяти, от которой мы "избавляемся" обнуляем (зануляем все данные удалённых структур).
Зачем? Потому что в моей программе предусмотрен вывод структур, а точнее всех их данных, и поэтому, если мы "избавляемся" от какой-то области памяти, а потом (к примеру) снова увеличим размер массива (добавим ещё структур), то если я сделаю вывод всех структур, выведется в консоль мусор\старые значения "избавленных" структур.
помогите пожалуйста правильно реализовать эти строки.
diff*sizeof(Campus) или что у тебя там
long long int size_building = sizeof(Building_t); n_old_size = n * size_building; n_new_size = size_building * n;
дай код на godbolt.org
https://godbolt.org/z/shz1W6zs7
какой инпут?
любой
а можно еще раз, зачем тебе кейс n_new_size < n_old_size && Campus и при реалоке нужно делать временый поинтер его чекать потом уже присваивать новое
если старый больше нового, то нужно зачистить, на текущий момент, неиспользованную область памяти
ну на 65 строке у тебя heap-buffer-overflow у тебя реалок уже освобождает прошлую память
если так, то я правильно понимаю, что для функции showBuildingSpecs нужно самой проверять, что она будет выводить? если ты уловил суть проблемы, из-за которой мне пришлось memset(p_new, 0, diff); делать, то ты понимаешь, что если было структур 3 с любыми данными введёнными из клавиатуры, а потом их стало 2, а затем 5, то только первая и вторая структура будут иметь не стёртые данные, но вот 3 - "стёртые" (но по факту там останутся данные, которые вводились), а 4 и 5 с нулями
так ты вроде ставишь размер структуры,а потом ее выводишь, как разница какие данные там остались в освобожденой памяти?
потому что функцией showBuildingSpecs не предусмотрено, что она выводит, а предусмотрено memset`ом
я зря поднял вопрос, я видимо где-то в коде что-то лишнее оставил и поэтому у меня такой вывод происходил. Сейчас же я смотрю, и в случае сужения размера и расширения после этого, все значения обнулены 💀💀
Обсуждают сегодня