Когда мне нужно освободить выделенную память? - PullRequest
1 голос
/ 18 июня 2020

Я новичок в микроконтроллерах и указателях, и я не уверен, где освободить выделенную память и будет ли этот пример работать правильно:

Пример 1:

char * function(void)
{
    char *help;
    help = malloc(sizeof(char));
    //...
    return help;
}

void main(void)
{
    char *pointer = function();
    //do something with pointer
    //do I have to free(pointer); here?
}

Это возможно ли выделить память для помощи в функции и вернуть адрес без памяти, которая должна быть освобождена к концу функции?

  • Если да: нужно ли мне освобождать память в основной после использования ?
  • Если нет: следующий пример работает правильно?

Пример 2:

void function(char **pointer)
{
    *pointer = malloc(sizeof(char));
    //...
}

void main(void)
{
    char *pointer;
    function(&pointer);
    //do something with pointer
    free(pointer);
}

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Как правило - не используйте mallo c style Dynami c выделение памяти в среде с очень ограниченными ресурсами u C. Многие промышленные стандарты полностью запрещают это.

Программирование u C существенно отличается от программирования большой машины.

Если вы проигнорируете этот совет и решите использовать mallo c - практическое правило - храните память как можно дольше. Наличие в куче 0x200 байт и частое устранение ошибок и освобождение памяти очень быстро приводят к фрагментации кучи и программе cra sh.

0 голосов
/ 18 июня 2020

Если вы пишете «голый» код для микроконтроллера, обычно это должен быть Su perloop, который поддерживает работу вашего приложения. Следовательно, учитывая приведенные выше утверждения, всегда следует освобождать память после ее использования, так как из-за этого Su perloop программа приведет к переполнению памяти, и ваше приложение сработает sh.

Ваш приведенный выше код подходит для работы в ОС, поскольку ОС освободит память после выхода из программы. Но всегда полезно освобождать память, как только она больше не используется.

...