Во-первых, память, которую вы не освобождаете, это SimpleXy * Link * myList
, а не память внутри simpleXyList (вы освобождаете память, на которую ссылается это просто отлично).
В общем, вам решать, как освободить всю используемую память.Как правило, вы освобождаете упомянутые данные перед структурой, которая на них ссылается, например:
void FreeSimpleXy(SimpleXyLink *myList) {
free(myList->simpleXyList);
free(myList);
}
Обратите внимание (однако, только на C ++), что если вы использовали new
для выделения этих, вы должны использовать вместо этого бесплатное удаление!
Если вы используете C ++, есть и более надежные способы.Во-первых, деструкторы.Вы можете изменить SimpleXyLink
следующим образом:
struct SimpleXyLink
{
int num_xy;
SimpleXY *simpleXyList;
~SimpleXyLink() {
delete simpleXyList;
}
SimpleXyLink() {
simpleXyList = NULL; // run when object is created with new
}
};
Теперь вы можете просто сделать delete someLink;
, и он автоматически освободит содержащий simpleXyList. Однако , имейте в виду, что вы не должны использовать malloc
и free
сейчас - используйте new
и delete
вместо:
SimpleXyLink *link = new SimpleXyLink;
link->simpleXyList = new SimpleXYList;
delete link; // all gone!
Наконец, есть еще один почти магический способ работы - использование умных указателей (также только C ++).Они будут добавлены в следующую версию C ++, но вы можете использовать их сегодня с помощью библиотеки повышения .
struct SimpleXyLink {
int num_xy;
boost::scoped_ptr<SimpleXyList> simpleXyList; // or shared_ptr
};
Они устранят необходимость в написании деструктора (вы по-прежнемуоднако необходимо использовать new
и delete
!), но они также несут с собой и другие ограничения.Перед использованием внимательно прочитайте документацию, на которую я ссылался, и не стесняйтесь задавать другой вопрос, если вы все еще не уверены.