После освобождения памяти указателя я могу повторно присвоить значение
Привет, я изучаю некоторые концепции отладки. В этой программе я пытаюсь смоделировать дамп ядра. Я ожидаю, что ядро будет сброшено, но оно не генерирует ядро. Программа выполняется без каких-либо проблем.
Сначала я выделяю 20 байтов для ptr. Я копирую одну новую строку в ptr. Тогда я освобождаю ptr, затем печатаю ptr, он работает без каких-либо проблем. Наконец, я назначаю еще одну строку, которая, как я ожидаю, на этот раз может генерировать дамп ядра. Но я не получил дамп ядра. Может кто-нибудь, пожалуйста, объясните, почему его не генерирует дамп ядра.
int main()
{
char *ptr;
ptr =(char*) malloc (20);
strcpy(ptr,"MemoryOperations");
printf("Before Free memory : %s\n",ptr);
free(ptr);
printf("After Free memory : %s\n",ptr);
strcpy(ptr,"MemReassign");
printf("After Re Assigning : %s\n",ptr);
return 0;
}
Тот же код, который я запускаю, используя dbx,
(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04: call _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit
2 ответа
free(ptr) не изменяет значение ptr. Это просто отмечает, что соответствующее местоположение доступно для перераспределения.
A block of memory previously allocated by a call to malloc, calloc or realloc is
deallocated, making it available again for further allocations.
Notice that this function does not change the value of ptr itself,
hence it still points to the same (now invalid) location.
--cplusplus.com
Следовательно, если вы действительно хотите создать дамп ядра, попробуйте что-нибудь верное, попробуйте что-нибудь сумасшедшее, например
char d=10/0; //arithematic
char *a=malloc(1);
free(a);
a=NULL; //this is important after free.
*a=100;
Если вы запишите в память после того, как она будет освобождена, все может произойти. Это неопределенное поведение. Вы можете получить дамп ядра или нет. В вашем случае вы не получите дамп ядра, потому что память, даже если она была освобождена, все еще доступна вашему процессу. Buf, если бы вы сделали другой malloc
как раз перед return 0
и записать в эту память строку "После переопределения...", скорее всего, будет перезаписана.
С dbx, то printf("After Free memory : %s\n",ptr);
оператор выдает ошибку "Read from unallocated", потому что вы включили проверку доступа, но без dbx вообще нет проверки доступа.
Для моделирования дампа ядра вы можете сделать это:
void main()
{
char *p = NULL ;
*p = 'A' ;
}
Это приведет к сбою на большинстве платформ.