Как освободить структуру C? - PullRequest
4 голосов
/ 08 января 2009

Учитывая структуру, например,

typedef struct
{
  int value;
} TestStruct;

Почему следующий код (в контексте класса Objective-C, работающего на IPhone) выдает исключение "освобождение невыровненного указателя"?

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

N.B. Моя цель - использовать библиотеку C со многими векторно-математическими функциями, поэтому мне нужно найти какой-нибудь жизнеспособный способ смешать C и Objective-C

.

Ответы [ 2 ]

25 голосов
/ 08 января 2009

Мне кажется, что вы пытаетесь освободить стек или статическую переменную. Вам нужно иметь malloc () и что-то, чтобы он мог быть свободным () 'd.

Попробуйте вместо этого:

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

Для тех, кто более знаком с объектно-ориентированными языками, может оказаться полезным создать конструктор:

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

Это позволяет вам выделить структуру и установить значения за один шаг. Просто помните, что это значение должно быть освобождено, как только оно перестает быть полезным:

TestStruct *x = newTestStruct(3);
free(x);
7 голосов
/ 08 января 2009

Потому что вы пытаетесь освободить что-то, что было выделено в стеке. Функция free () может быть вызвана только для памяти, выделенной с помощью malloc ().

...