Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
1

Грабли malloc/free

02.04.2013, 22:21. Просмотров 2495. Ответов 8
Метки нет (Все метки)

С динамической памятью впервой работаю, от сюда и грабли

Есть структура

typedef struct {
uint8_t data_size;
uint8_t *data;
} rf_packet_atom_t ;

typedef rf_packet_atom_t* rf_packet_atom_p;

создаю так:
rf_packet_atom_p atom;
atom = malloc( sizeof(rf_packet_atom_t) );
atom->data_size = 15;
atom->data = malloc( atom->data_size );

потом перестала она мне быть нужна

сделал функцию

void free_atom(rf_packet_atom_p atom)
{
free( atom->data);
free( atom );
}

Дык вот после выхода atom не NULL. Даже так пробывал:

void free_atom(rf_packet_atom_p atom)
{
free( atom->data);
free( atom );
atom =NULL;
}

Функция free_atom нужна именно как функция, она еще кое чего делает. Как мне быть ? Где я туплю ?

Подозреваю, что параметр atom я не могу изменить. Надо передавать указатель на указатель ?

Покажите правильный пример из своих исходников. Спасибо.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2013, 22:21
Ответы с готовыми решениями:

malloc/free
Делаю устройство. Atmega16. Принимает пакеты по RF. Всего полезных данных передается 512 байт....

Xmega грабли
Так понимаю, мало кто в форуме xmega занимается, но вдруг кому полезно будет. Они, конечно, описаны...

когда студия 5 то выйдет рабочая версия и она free???
будет ли она бесплатной?и я так понял в ней встроенный си компиллер будет?

ATMega8: Виснет "Free Running Mode" (решено, просто туплю)
Настраиваю АЦП: опорное AVCC, выровнить по левому краю, канал ADC5 OUTI ADMUX, (0b01<<REFS0) |...

Из malloc-free в new delete
Есть код с выделением памяти с помощью malloc, надо сделать с new delete Вроде сделал,...

8
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
02.04.2013, 22:43 2
atom и не должен быть NULL. Функция free работает с описанием кучи. Она даже данные не удаляет. Она просто вносит в специальную таблицу запись о том, что блок памяти такой-то может быть распределен в дальнейшем при помощи функции malloc. Ничего больше она делать не должна.

Код, ИМХО, работать должен.

З.Ы. Таблица, на самом деле и не таблица вовсе, а скорее список, но не суть.

З.З.Ы. Функция free даже не проверяет, распределялась ли область памяти на которую ее натравили... вызов функции free с некоректным указателем может вызвать крах программы.
0
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
02.04.2013, 22:52 3
... Хм... Только не...
atom = malloc( sizeof(rf_packet_atom_t) )
, а
atom =(rf_packet_atom_t) malloc( sizeof(rf_packet_atom_t) )
все таки, наверно...

Но в принципе, если компилятор не ругается, то это не важно.
0
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
02.04.2013, 23:00 4
Ну, а чтобы он все-таки обнулялся:

void free_atom(rf_packet_atom_p *atom)
{
free( &atom->data);
free( &atom );
&atom =NULL;
}
0
02.04.2013, 23:00
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
02.04.2013, 23:03 5
Цитата Сообщение от Myrmyk
Ну, а чтобы он все-таки обнулялся:

void free_atom(rf_packet_atom_p *atom)
{
free( &atom->data);
free( &atom );
&atom =NULL;
}
указатель на указатель ? верно ?
0
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
02.04.2013, 23:12 6
да... И, соответственно, вызывать функцию придется как atom_free(&atom);.

Кстати, если пишете не на Си, а на Си++, то можно:

Воспользоваться механизмом ссылок:

void free_atom(rf_packet_atom_p &atom)
{
free( atom->data);
free( atom );
atom =NULL;
}

И вызов тогда будет простым: atom_free(atom);
0
ridsh
0 / 0 / 0
Регистрация: 16.12.2011
Сообщений: 30
04.04.2013, 11:27 7
... Хм... Только не...
atom = malloc( sizeof(rf_packet_atom_t) )
, а
atom =(rf_packet_atom_t) malloc( sizeof(rf_packet_atom_t) )
все таки, наверно...
Нет, правильно у автора. Кастить нужно только при несовпадении типа указателя (что потенциально может быть ошибкой). void* же, который возвращает malloc - нетипизированный указатель.
void free_atom(rf_packet_atom_p *atom)
{
free( &atom->data);
free( &atom );
&atom =NULL;
}
Не правильно.
Кстати, если пишете не на Си, а на Си++, то можно:
Воспользоваться механизмом ссылок:
Пишите лучше на чистом Си.
Дык вот после выхода atom не NULL. Даже так пробывал:

void free_atom(rf_packet_atom_p atom)
{
free( atom->data);
free( atom );
atom =NULL;
}
И почему оно должно быть NULL? В функцию передаётся копия переменной. Не важно, какого она типа. Указатель - адрес в памяти, где лежит твоя структура. После free по этому адресу будет мусор, но сам указатель - обычная переменная в твоей программе, ничем не отличающаяся от других переменных. Её значение само по себе не изменится. А чтобы функция что-то могла записать в переменную, надо передать в функцию указатель на неё (в данном случае, указатель на указатель - rf_packet_atom_p *atom). Тогда функция будет знать где хранится эта переменная (а не только её значение). Внутри же функции, чтобы обратиться к изначальной переменной, а не к указателю на неё, нужно использовать обращение по указателю - free( (*atom)->data), *atom = NULL. Чтобы собственно, передать в функцию указатель на переменную, пишем - free_atom(&x). &x - получение адреса переменной. Однако, если x - локальная переменная вызывающей функции, обнулится только она. Ссылки в C++ - то же самое, только в более неявном и мутном виде. Забудешь "&" - и уже работаешь в функции не с внешней переменной по указателю, а с локальной переменной. В чистом Си же чётко видно - где указатель, а где нет. Без лишних сущностей.
0
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
04.04.2013, 18:21 8
да... что-то я глупость напи
сал....
0
Myrmyk
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
04.04.2013, 18:23 9
что -то я глупость написал....
0
04.04.2013, 18:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 18:23

malloc, free error
Здравствуйте. Возникла следующая проблема. Код ниже: string http_headers = "GET /index.asd...

Освобождение памяти malloc free
В общем работаю над расширением для php (для тренировки в php и в c++ сразу) Суть дела вот в чем,...

Собственная реализация malloc, free
Нужно написать собственную реализацию malloc, free без использования calloc и всего подобного. Где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.