Цитата(Сергей Борщ @ May 20 2015, 18:23)

Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода.

(Не смог удержаться)
Цитата
Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике.
http://www.tutorialspoint.com/c_standard_l...nction_free.htmХотите удивлю? Я всегда думал, что перед тем как освобождать память, нужно эту память занять с помощью функций malloc или calloc, но(о Боги) я обнаружил, что мой указатель создаётся не динамически, а *уй пойми как. Проследим цепочку событий:
1) Создаётся указатель на void(в стеке или в статической памяти, хз) в структуре
Код
void *pClassData;
2) Указатель разыменовывается
Код
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
Идём по следу функции
Код
#define USBD_malloc (uint32_t *)USBD_static_malloc
Дальше идём
Код
void *USBD_static_malloc(uint32_t size)
{
static uint8_t mem[sizeof(USBD_CDC_HandleTypeDef)];
return mem;
}
Тупо создан массив и возращен указатель на его начало.
3) Указатель освобождается непонятным образом через функцию free:
Код
USBD_free(pdev->pClassData);
pdev->pClassData = NULL;
По мне так тут достаточно второй строки кода, указанного выше.
Код
#define USBD_free USBD_static_free
void USBD_static_free(void *p)
{
free(p);
}
Объясните мне, как это вяжется?
Цитата(Эдди)
А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено?
Да нет там нихрена на самом деле.