Утечка памяти при доступе, используя указатель, к элементам из структуры, полученной аргументом - PullRequest
0 голосов
/ 23 октября 2019

Немного контекста: Недавно я разработал универсальную функцию для обновления отображаемого изображения, основываясь только на том, какие его части изменились. Для этого я получаю в качестве параметра известную структуру, членами которой являются массивы символов (отображаемые строки), и сравниваю ее с отображаемой в данный момент информацией, чтобы обновить только необходимое, улучшив производительность. Это встроенная система для arm cortex-m0, если это имеет значение. Ниже приведен фрагмент кода кода для структуры.

struct displayLines {
    char firstLine[13];
    char secondLine[13];
    char thirdLine[13];
    char fourthLine[13];
    char fivethLine[13];
    char sixthLine[13];
};
typedef struct displayLines st_displayLines;

На основе этой структуры я использую указатель, инициализированный с адресом первого элемента, и оперирую им для доступа ко всем данным структуры (все строки). Ниже приведен фрагмент кода, показывающий, как я инициализирую указатель.

void updateScreen(st_displayLines st_toDisplay)
{
    char *ptrtoUpdate  = st_toDisplay.firstLine;
    char *ptrDisplayed = st_currentlyDisplayed.firstLine;

    //Here is the update code which consumes the pointers.
}

После работы с той же переменной указателя (с использованием арифметики над ней) и использования ее данных я просто возвращаюсь из функции, без вызова free операция над переменной-указателем.

Наконец, возникает вопрос:
Это утечка памяти? Или выделенная память для создания указателей будет освобождена, как только я выйду из области действия функции?
Если это утечка, будет ли она содержать 1 байт на каждую переменную указателя моей памяти каждый раз, когда я вызываю эту функцию? Таким образом, что (делая числа теперь), если у меня есть только 10 байтов доступной памяти, при 6-м вызове функции моя программа потерпит крах?

1 Ответ

2 голосов
/ 23 октября 2019

Утечки памяти происходят, когда память, выделенная с помощью malloc, больше не имеет указателя, указывающего на нее, и память не освобождается. Код, как вы показали, не выделяет память, поэтому нет утечки.

Простое использование переменной указателя ничем не отличается от использования int. Переменная находится в области видимости в той точке, в которой она была объявлена, и выходит из области видимости в конце прилагаемого составного оператора. Так что не нужно ничего освобождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...