Проблема с переменной char* malloc/free. Пустое содержимое в переменной получателя после использования free

Я работаю над пользовательским регистратором данных SD-карты, используя следующую функцию и структуру:

char *filenameCreator(const char *prefix, const char *num, bool addExtension)
{
    char *filename = (char *)malloc(13 * sizeof(char));
    const char *uScore = "_";
    strcpy(filename, prefix);
    strcat(filename, uScore);
    strcat(filename, num);
    if (addExtension)
    {
        const char *ext = LOGFILE_EXTENSION;
        strcat(filename, ext);
    }
    delete[] num;
    return filename;
}

где вывод будет сохранен в переменной следующего типа:

struct FileInfo
{
    const char *fileName;
    double fileSize;
};

с FileInfo fileToDelete; и глобальная переменная char* createdFilename = nullptr; для временного хранения выходных данных функции.

Проблема в том, что при использовании следующих функций fileToDelete.fileName ПУСТО:

createdFilename= filenameCreator("FILE", numericConverter(receivedIndexSATCOM), true);
fileToDelete.fileName = createdFilename;

free(createdFilename);    // похоже, очищает содержимое переменной, в которой хранилось имя файла, а именно fileToDelete.fileName
createdFilename = nullptr;

Я стараюсь придерживаться правил освобождения памяти, используемой переменными, выделенными с помощью malloc.

Обратите внимание, что если я НЕ ИСПОЛЬЗУЮ free(createdFilename), код работает нормально и fileName создается правильно. Однако меня беспокоит неопределенное поведение или ошибочные ответы.

Вот пример имени файла, успешно созданного без использования free():

Мне всегда нужно освобождать указатель после каждого использования? Почему содержимое пустое даже после присвоения содержимого другой переменной?

РЕДАКТИРОВАТЬ:

Пожалуйста, вместо того, чтобы ставить минусы моему вопросу, прокомментируйте, что в нем не так, и я постараюсь его улучшить. Будьте зрелыми.

, 👍0


1 ответ


Лучший ответ:

3

То, что у вас есть, называется "Висячий указатель". Вы пытаетесь использовать указатель, указывающий на память, которая была освобождена и больше не содержит того, что, по вашему мнению, он делает.

Эта строка кода в функции filenameCreator:

char *имя_файла = (char *)malloc(13 * sizeof(char));

выделяет блок памяти в куче и сохраняет указатель на него. Позже в функции вы возвращаете этот указатель.

возврат имени файла;

Когда вы вызываете эту функцию:

createdFilename= filenameCreator("FILE", numericConverter(receivedIndexSATCOM), true);

Вы присваиваете это значение указателя новому указателю. Теперь createdFilename указывает на этот блок памяти, который вы выделили в функции.

Когда вы дойдете до этой строки:

free(созданоимя_файла);

Это освобождает блок памяти, на который указывается. Это означает, что его содержимое может быть уничтожено, или оставлено там, или использовано для чего-то другого. Вы сказали этой строкой кода, что больше не будете его использовать.

Если вы попытаетесь использовать createdFilename позже, он все равно будет указывать на то же место в памяти. Но то, что вы там хранили, было освобождено. Его там больше нет.

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

Важно освобождать выделенную память, но только тогда, когда вы больше не будете ее использовать.

,