Как освободить память структуры с указателями на другую структуру - PullRequest
1 голос
/ 13 января 2011

У меня есть две структуры

struct SimpleXY
{
    double x;
    double y;

};

    struct SimpleXyLink
    {
            int num_xy;
            SimpleXY *simpleXyList;
    };

Интересно, как правильно освободить память, удерживаемую SimplyXyLink? Я сейчас использую

void Free(SimpleXyLink *myList)
{

    free(myList->simpleXyList);
}

Но я думаю, что это неправильно, поскольку оно не освобождает память внутри элемента simpleXyList.

Ответы [ 3 ]

5 голосов
/ 13 января 2011

Во-первых, память, которую вы не освобождаете, это 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!), но они также несут с собой и другие ограничения.Перед использованием внимательно прочитайте документацию, на которую я ссылался, и не стесняйтесь задавать другой вопрос, если вы все еще не уверены.

2 голосов
/ 13 января 2011

Если это C ++ (я запутался, потому что вы используете free: -))

struct SimpleXY
{
    double x;
    double y;

};

struct SimpleXyLink
{   
    SimpleXyLink() : simpleXyList( new SimpleXY ) { }
    ~SimpleXyLink() { delete simpleXyList; }

    int num_xy;
    SimpleXY *simpleXyList;
};

int main() 
{
    SimpleXyLink* pXYLink = new SimpleXyLink();

    delete pXYLink;
}
0 голосов
/ 13 января 2011

Это полностью зависит от того, как вы распределили память.Освобождение памяти всегда должно отражать распределение.

Тем не менее, free почти наверняка неверно в C ++.Используйте new / delete вместо malloc / free.

Более того, кажется, что вы выделяете память для нескольких элементов ее (по крайней мере, из названия …List это подразумевается)так что вам, вероятно, будет лучше использовать структуру контейнера C ++, такую ​​как vector или list.

...