Domanda

Ciao sto imparando alcuni concetti di debug.In questo programma sto cercando di simulare il dump del core.Mi aspetto che il core sarà scaricato ma non è generato un nucleo.Il programma esegui senza alcun problema.

Prima assegno 20 byte per PTR.Copia una nuova stringa in PTR.Quindi I Free PTR quindi stampa PTR funziona senza alcun pblm.Infine, assegnando qualche altra corda, mi aspetto questa volta che può generare il core dump.Ma non ho ricevuto una discarica di base.Qualcuno può spiegare perché non sta generando una discarica di base.

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;
}
.

Lo stesso codice che ho eseguito utilizzando 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
.

È stato utile?

Soluzione

GRATIS (PTR) non modifica il valore del PTR.Segna solo che la posizione corrispondente è disponibile per la riallocazione.

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
.

Quindi se vuoi effettivamente generare il doppio di base prova qualcosa di sicuro, prova qualcosa di pazzo, come:

char d=10/0;  //arithematic

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

Altri suggerimenti

Se scrivi in memoria dopo che è stato liberato, qualsiasi cosa può accadere.È un comportamento indefinito.Puoi ottenere una discarica centrale o no.Nel tuo caso non ottieni una discarica di base perché la memoria, anche se è stata liberata, è ancora accessibile dal tuo processo.BUF Se si farebbe un altro malloc poco prima dell'istruzione return 0 e scrivere in quella memoria, la stringa "dopo aver assegnato ..." molto probabilmente sarà sovrascritta.

Con DBX, l'istruzione printf("After Free memory : %s\n",ptr); produce un errore "Leggi da non allocato" perché è stato acceso il controllo dell'accesso, ma senza DBX non è presente alcun controllo di accesso.

Per simulare un dump del core puoi fare questo:

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

Questo si schianterà sulla maggior parte delle piattaforme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top