Как освободить структуру C?
-
06-07-2019 - |
Вопрос
Учитывая структуру, например.
typedef struct
{
int value;
} TestStruct;
Почему следующий код (в контексте класса Objective-C, работающего на IPhone) выдает исключение «освобождаемый непривычный указатель»?
TestStruct ts = {33};
free(&ts);
Н.Б.Моя главная цель — использовать библиотеку C со множеством векторно-математических функций, поэтому необходимо найти какой-нибудь жизнеспособный способ смешивать C и Objective-C.
Решение
Мне кажется, что вы пытаетесь освободить стек или статическую переменную.Вам нужно что-то сделать с помощью malloc(), чтобы оно могло быть свободным().
Вместо этого попробуйте это:
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);
Другие советы
Потому что вы пытаетесь освободить что-то, что было выделено в стеке.Функцию free() можно вызвать только в памяти, выделенной с помощью malloc().