Что происходит с памятью после free ()? - PullRequest
6 голосов
/ 26 февраля 2011

Я знаю, что на вашем жестком диске, если вы удалите файл, данные не исчезнут (мгновенно).Данные все еще там, пока они не будут перезаписаны.Мне было интересно, существует ли подобная концепция в памяти.Скажем, я выделил 256 байтов для строки, эта строка все еще плавает в памяти где-то после того, как я free() это до ее перезаписи?

Ответы [ 4 ]

5 голосов
/ 26 февраля 2011

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

3 голосов
/ 26 февраля 2011

Ответ сильно зависит от реализации.При хорошей реализации вполне вероятно, что по крайней мере начало (или конец?) Памяти будет перезаписано бухгалтерской информацией для отслеживания свободных порций памяти, которые впоследствии могут быть использованы повторно.Однако детали будут отличаться.Если ваша программа имеет какой-либо уровень параллелизма / потоков (даже в реализации библиотеки, которую вы можете не увидеть), то такая память может быть засорена асинхронно, возможно даже таким образом, что даже чтение ее опасно.И, конечно же, реализация free может полностью отключить диапазон адресов из виртуального адресного пространства программы, и в этом случае попытка что-либо с ним сделать приведет к сбою вашей программы.Вы должны просто обработать free согласно спецификации и никогда не обращаться к освобожденной памяти.Но с точки зрения системного разработчика или интегратора, может быть полезно узнать (или спроектировать) реализацию, и тогда ваш вопрос будет интересен.

3 голосов
/ 26 февраля 2011

Ваша аналогия верна. Данные в памяти не исчезают или что-то в этом роде; значения действительно могут оставаться там после free(), хотя попытка чтения из освобожденной памяти является неопределенным поведением.

2 голосов
/ 26 февраля 2011

Если вы хотите проверить поведение вашей реализации, простая программа ниже сделает это за вас.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* The number of memory bytes to test */
#define MEM_TEST_SIZE 256

void outputMem(unsigned char *mem, int length)
{
    int i;

    for (i = 0; i < length; i++) {
        printf("[%02d]", mem[i] );
    }   
}

int bytesChanged(unsigned char *mem, int length)
{
    int i;
    int count = 0;

    for (i = 0; i < MEM_TEST_SIZE; i++) {
        if (mem[i] != i % 256)
            count++;
    }
    return count;
}

main(void)
{
    int i;
    unsigned char *mem = (unsigned char *)malloc(MEM_TEST_SIZE);

    /* Fill memory with bytes */
    for (i = 0; i < MEM_TEST_SIZE; i++) {
        mem[i] = i % 256;
    }

    printf("After malloc and copy to new mem location\n");
    printf("mem = %ld\n", mem );
    printf("Contents of mem: ");
    outputMem(mem, MEM_TEST_SIZE);

    free(mem);
    printf("\n\nAfter free()\n");
    printf("mem = %ld\n", mem );
    printf("Bytes changed in memory = %d\n", bytesChanged(mem, MEM_TEST_SIZE) );
    printf("Contents of mem: ");
    outputMem(mem, MEM_TEST_SIZE);


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