Я получаю сообщение об ошибке при попытке освободить память для свойства структуры. Где проблема в этом коде?
struct Employee {
char * name;
int id;
};
struct Employee* new_Employee(char *name, int id) {
struct Employee* this = (struct Employee*)malloc(sizeof(struct Employee));
if (this == NULL) {
return NULL; // Out of memory...
}
this->name = name;
this->id = id;
return this;
}
int main() {
// Create an employee
struct Employee *employee1 = new_Employee("Person A", 1);
free(employee1 -> name);
}
Homework_0_0(81607,0x10ffba5c0) malloc: *** error for object 0x10a41ffab: pointer being freed was not allocated
Homework_0_0(81607,0x10ffba5c0) malloc: *** set a breakpoint in malloc_error_break to debug
@RetiredNinja Я не понимаю, как не была выделена память, когда переменная имеет значение при вызове free().
Вы использовали malloc для выделения памяти для вашей структуры Employee, вам нужно сопоставить это с free, чтобы избежать утечки памяти. Вы не использовали malloc для выделения памяти для строкового литерала «Person A», поэтому вы не можете ее освободить. Строковые литералы особенные, как объяснено в связанном дубликате. Если вы сделали копию этой строки в выделенную память с помощью malloc/strcpy или strdup, вам нужно будет освободить эту память.
Обратите внимание, что операторы точка . и стрелка -> связаны очень тесно и не должны иметь пробелов вокруг них. Вы правильно форматируете оператор стрелки в функции new_Employee(); вы не в main().
Вы можете освободить employee1 — free(employee1); — но вы не можете освободить имя. Если вы не уверены, было ли выделено имя (и, следовательно, может быть освобождено), вам нужно убедиться, что вы непротиворечивы; всегда выделяйте имя в функции new_Employee() и копируйте то, что пользователь передал в выделенное пространство, или никогда не выделяйте и оставляйте вызывающему абоненту возможность освободить пространство. Часто создание копии имеет свои преимущества, но требует осторожности, чтобы освободить все, что должно быть освобождено (и чтобы вы не пытались освободить то, что освобождать не следует). Но можно упростить правила.





Вы не выделили память для
name, вы просто указали ее на строковый литерал. Вы не можете освободить то, что вы не выделили.