Что происходит, когда 2 указателя указывают на одну и ту же область и 1 из них освобожден?
oldPointer = (char*)malloc(1000);
newPointer = (char*)realloc(oldPointer, 2000)
oldPointer и newPointer могут не указывать на одну и ту же область,Это то, что делает realloc()
.Новый указатель может отличаться, если диспетчер памяти решит это сделать (например, если в старой области недостаточно места для заполнения нового необходимого пространства).Предположение, что они указывают на одну и ту же область, вызывает неопределенное поведение (UB - может или не может работать не так, как вы ожидаете, что приводит к трудной отладке).
1 из них освобожден
После
oldPointer = (char*)malloc(1000);
newPointer = (char*)realloc(oldPointer, 2000)
Вы не можете использовать oldPointer
после этого realloc
.Существует только newPointer
.Если вы освободили oldPointer
и адрес изменился, UB (вероятен сбой).Если вы освободили oldPointer
и это был тот же адрес, что и newPointer
, это, конечно, то же самое, что и newPointer
.
В любом случае, правило простое: не используйте oldPointer
послеэто будет перераспределено.Если только
oldPointer = malloc(1000);
oldPointer = realloc(oldPointer, 2000);
^^^
вы не используете тот же указатель.Но не рекомендуется, если произошел сбой realloc
, у вас нет следов ранее выделенного адреса (если вы не сохранили его);это утечка.
И не приводите malloc / realloc.