Question

Given a struct, e.g.

typedef struct
{
  int value;
} TestStruct;

Why does the following code (in the context of an Objective-C class running on the IPhone) throw a "non-aligned pointer being freed" exception?

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

N.B. My uber goal is to use a C library with many vector-math functions, hence the need to find out some viable way to mix C and Objective-C

Was it helpful?

Solution

It looks to me like you're trying to free a stack or static variable. You need to have malloc()'d something for it to be able to be free()'d.

Try this instead:

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

For those more familiar with object-oriented languages, you might find it helpful to create a constructor:

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

This enables you to allocate a struct and set the values in one step. Just remember that this value should be freed once it's no longer useful:

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

OTHER TIPS

Because you are trying to free something that was allocated on the stack. The function free() can only be called on memory that was allocated with malloc().

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