Pergunta

Oi eu sou a aprendizagem de alguns conceitos de depuração.Neste programa, eu estou tentando simular o despejo.Espero núcleo vai ser despejado, Mas não é gerar core.Programa a executar, sem qualquer problema.

Primeiro eu alocar 20 bytes para o ptr.Eu copiar uma nova seqüência de caracteres para o ptr.Então eu grátis ptr, em seguida, imprimir ptr-lo a trabalhar sem qualquer pblm.Finalmente eu voltar a atribuir uma outra seqüência de eu esperar esse tempo pode gerar core dump.Mas eu não consiga um core dump.Alguém pode pls explicar por que a sua não geração de core dump.

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

Mesmo código, eu executado usando o 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
Foi útil?

Solução

free(ptr) não modifica o valor da ptr.Ele só marca o correspondente local está disponível para realocação.

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

Portanto, se você realmente deseja gerar o despejo de tentar algo tiro certo, em seguida, tentar algo louco, como:

char d=10/0;  //arithematic

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

Outras dicas

Se você escrever na memória depois de ter sido libertada, tudo pode acontecer.É indefinido comportamento.Você pode obter um core dump ou não.No caso de você não ter um despejo de memória, porque a memória, mesmo que ela tenha sido libertada, ainda está acessível pelo seu processo.Buf se você gostaria de fazer outro malloc pouco antes de o return 0 instrução e de escrita em que a memória, a seqüência de caracteres "Depois de Voltar a Atribuir ...", o mais provável será substituído.

Com dbx, o printf("After Free memory : %s\n",ptr); instrução produz uma Leitura "não alocado" erro porque você tem ligado a verificação de acesso, mas sem dbx não há nenhuma verificação de acesso a todos.

Para simular um despejo de memória, você pode fazer isso :

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

Isto irá falhar na maioria das plataformas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top