Вопрос

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

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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top