Question

These are the structs I defined (don't mind the language):

typedef struct cliente
{
    char* primeiroNome;
    char* ultimoNome;
}Cliente;

typedef struct data
{
    int dia;
    int mes;
    int ano;
}Data;

typedef struct reserva
{
    Data* data;
    int numReservas;
    struct cliente* cliente;
    struct reserva* next;
}Reserva;

Then I created a list:

Reserva* novaListaReservas() // in English the name would be something like newReservationsList()... I guess
{
    Reserva* lista = (Reserva*)malloc(sizeof(Reserva));
    lista->next = NULL;
    lista->numReservas = 0;
    return lista;
}

Then in some function I did this (well not quite but for e.g. assume it was):

Reserva* reserva = novaListaReservas();
Cliente* cliente = (Cliente*)malloc(sizeof(Cliente));
Data* data = (Data*)malloc(sizeof(Data));

data->dia = 30;
data->mes = 4;
data->ano = 2014;

cliente->primeiroNome = (char*)malloc(15 * sizeof(char));
cliente->ultimoNome = (char*)malloc(15 * sizeof(char));

reserva->data = data;
reserva->cliente = cliente;

/*stuff done here/*
//End of Function

Now I'm in some other function that only has (Reserva* reserva) as a parameter I tried:

free(reserva->cliente->primeiroNome);
free(reserva->cliente->ultimoNome);
free(reserva->cliente);
free(reserva->data);

But I don't think it's working because after this I still can access reserva->data->dia/mes/ano...

What's wrong with the way I'm freeing? Is there a way to check if the free 'worked'?

Was it helpful?

Solution

You can still access freed memory, but it's undefined behavior. It might still contain the "old" data, or it might now contain something completely bogus.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top