или же

я есть две структуры

struct SimpleXY
{
    double x;
    double y;

};

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

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

void Free(SimpleXyLink *myList)
{

    free(myList->simpleXyList);
}

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

 Graviton13 янв. 2011 г., 15:03
@KitsuneTYMG, я думаю, что все в порядке. Но в любом случае я изменил тег наc
 KitsuneYMG13 янв. 2011 г., 15:02
Вы отметили этоc++ но используютfree (и предположительноmalloc) Вы хотели пометить этоc вместо?
 KitsuneYMG13 янв. 2011 г., 15:06
Ну, как вы можете видеть из ответов, если вы пометите егоc++ и использоватьfree люди будут смущены тем, чего ты хочешь. Покаfree прекрасно работает в компиляторах с ++, способ размещения в с ++new

Ответы на вопрос(3)

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

 Graviton13 янв. 2011 г., 15:10
умные указатели - интересно! Но действительно ли это сборщик мусора в действии, и, следовательно, он унаследует все проблемы сборщика мусора?
 user1310721 февр. 2013 г., 03:22
Почему это рекомендуется делатьsimpleXyList = NULL; // run when object is created with new?
 ds2768013 янв. 2011 г., 15:19
@Graviton C ++ не имеет сборщика мусора.
 bdonlan13 янв. 2011 г., 15:48
Умные указатели просто автоматизируют технику деструктора, которую я показал вам - когда структура разрушена, деструкторы для всех (без указателя) члены также называются.scoped_ptr Затем деструктор удаляет указатель, скрытый внутриscoped_ptr, Кстати, тамнаходятся на самом деле сборщики мусора для C ++ (например,hpl.hp.com/personal/Hans_Boehm/gc) - но они, как правило, работают не так хорошо, как на других языках, предназначенных для предоставления более полезной информации для GC.

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

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

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

потому что вы используете бесплатно :-))

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;
}
 Graviton13 янв. 2011 г., 15:05
@ ds37680, извини, я думаю этоC, Тег отредактирован

Ваш ответ на вопрос