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

StackOverflow https://stackoverflow.com//questions/22064341

  •  23-12-2019
  •  | 
  •  

Вопрос

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

Сначала я выделяю 20 байт для ptr.Я копирую одну новую строку в ptr.Затем я освобождаю ptr, а затем печатаю ptr, который работает без какого-либо pblm.Наконец, я повторно назначаю какую-то другую строку, я ожидаю, что на этот раз она может сгенерировать дамп ядра.Но я не получил никакого дампа ядра.Кто-нибудь может, пожалуйста, объяснить, почему он не генерирует дамп ядра.

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
Это было полезно?

Решение

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
.

Следовательно, если вы на самом деле хотите генерировать Dump Core Temp, попробуйте что-то уверенное, что попробуйте что-нибудь сумасшедшее, как:

char d=10/0;  //arithematic

char *a=malloc(1);
free(a);
a=NULL;   //this is important after free.
*a=100;
.

Другие советы

Если вы записываете данные в память после того, как она была освобождена, может произойти все, что угодно.Это неопределенное поведение.Вы можете получить дамп ядра или нет.В вашем случае вы не получаете дамп ядра, потому что память, даже если она была освобождена, по-прежнему доступна вашему процессу.Но если бы ты сделал еще что-нибудь malloc как раз перед тем, как return 0 оператор и запишите в эту память строку "После повторного назначения...", скорее всего, будет перезаписана.

С помощью dbx, the printf("After Free memory : %s\n",ptr); инструкция выдает ошибку "Чтение из нераспределенного", потому что вы включили проверку доступа, но без dbx проверка доступа вообще не выполняется.

Для моделирования дампа ядра вы можете сделать это :

void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

Это приведет к сбою на большинстве платформ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top