realloc () висячие указатели и неопределенное поведение

Когда вы освобождаете память, что происходит с указателями, которые указывают на эту память? Они становятся недействительными немедленно? Что произойдет, если позже они снова станут действительными?

Конечно, обычным случаем, когда указатель становится недействительным, а затем снова становится «допустимым», будет некоторый другой объект, размещаемый в том, что происходит с памятью, которая использовалась ранее, и если вы используете указатель для доступа к памяти, этоочевидно неопределенное поведение. Повисшая память перезаписывает урок 1, в значительной степени.

Но что, если память снова станет действительной для того же распределения? Существует только один стандартный способ для этого:realloc(), Если у вас есть указатель куда-то вmalloc()'блок памяти со смещением> 1затем используйтеrealloc() очевидно, что для сокращения блока до значения меньше смещения указатель становится недействительным. Если вы тогда используетеrealloc() снова увеличьте блок обратно, чтобы хотя бы покрыть тип объекта, на который указывает висячий указатель, и ни в одном из случаевrealloc() переместить блок памяти, висячий указатель снова действителен?

Это настолько сложный случай, что я не знаю, как интерпретировать стандарты C или C ++, чтобы понять это. Ниже приведена программа, которая показывает это.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    static const char s_message[] = "hello there";
    static const char s_kitty[] = "kitty";

    char *string = malloc(sizeof(s_message));
    if (!string)
    {
        fprintf(stderr, "malloc failed\n");
        return 1;
    }

    memcpy(string, s_message, sizeof(s_message));
    printf("%p %s\n", string, string);

    char *overwrite = string + 6;
    *overwrite = '\0';
    printf("%p %s\n", string, string);

    string[4] = '\0';
    char *new_string = realloc(string, 5);
    if (new_string != string)
    {
        fprintf(stderr, "realloc #1 failed or moved the string\n");
        free(new_string ? new_string : string);
        return 1;
    }
    string = new_string;
    printf("%p %s\n", string, string);

    new_string = realloc(string, 6 + sizeof(s_kitty));
    if (new_string != string)
    {
        fprintf(stderr, "realloc #2 failed or moved the string\n");
        free(new_string ? new_string : string);
        return 1;
    }

    // Is this defined behavior, even though at one point,
    // "overwrite" was a dangling pointer?
    memcpy(overwrite, s_kitty, sizeof(s_kitty));
    string[4] = s_message[4];
    printf("%p %s\n", string, string);
    free(string);
    return 0;
}

Ответы на вопрос(3)

Ваш ответ на вопрос