Pergunta

Dado um struct, por exemplo.

typedef struct
{
  int value;
} TestStruct;

Por que o código a seguir (no contexto de uma classe de Objective-C rodando no iPhone) lançar um "ponteiro não-alinhados ser libertado" exceção?

TestStruct ts = {33};
free(&ts);

NB. Meu objetivo uber é usar uma biblioteca C com muitas funções vector-matemática, daí a necessidade de encontrar alguma maneira viável para misturar C e Objective-C

Foi útil?

Solução

Parece-me que você está tentando libertar uma pilha ou variável estática. Você precisa ter malloc () 'd algo para que ele seja capaz de ser livre ()' d.

Tente isto em vez disso:

TestStruct *ts = malloc(sizeof(TestStruct));
ts->value = 33;
free(ts);

Para aqueles mais familiarizados com linguagens orientadas a objeto, você pode achar que é útil para criar um construtor:

TestStruct *newTestStruct(int value)
{
    TestStruct *ret = malloc(sizeof(TestStruct));
    ret->value = value;
    return ret;
}

Isto permite-lhe atribuir um struct e definir os valores em uma única etapa. Basta lembrar que este valor deve ser liberado uma vez que não é mais útil:

TestStruct *x = newTestStruct(3);
free(x);

Outras dicas

Porque você está tentando libertar algo que foi alocada na pilha. A função free () só pode ser chamado em memória que foi alocada com malloc ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top