Pergunta

Friends

Em nossa C ++, atual Iam usando o método realloc para redimensionar a memória alocada por malloc. realloc (uso) é feito como abaixo

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

Agora Wikipeadia (_http: //en.wikipedia.org/wiki/Malloc) diz que

Se em vez um fez

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

, em seguida, no caso, não é possível obter big_size bytes de memória, p terá valor NULL e não temos mais um ponteiro para a memória alocada anteriormente para p, criando uma memória vazamento

E também diz que a maneira correta de corrigir o erro acima é

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

Você pode me dizer qual é a melhor maneira de usar realloc ()

Também uma vez que tenho ponteiro para uma estrutura e, em seguida, ao usar realloc mais tarde eu posso usar ponteiro para um vazio ???

Muito obrigado

Foi útil?

Solução

Claro que você deve proteger contra o caso que realloc() retornos NULL. É uma alocação de memória, e em C (onde realloc()) é usado, principalmente, eu acho que programadores C ++ acho que é um nível baixo bit / qaint usar chamadas realloc() matérias, as alocações de memória sempre pode falhar.

Diretamente substituir o ponteiro com o valor de retorno é um erro, como que cai o ponteiro original e faz com que o vazamento de memória no caso da realocação falhou.

Outras dicas

Malloc () e realloc () são funções C. Na verdade, realloc () faz malloc () e free (), dependendo dos argumentos que você passar:

  • Se você passar um ponteiro nulo, realloc faz o que malloc faz.
  • Se você passar um tamanho zero, realloc faz o livre faz.

Aqui , onde você tem uma explicação mais profunda.

A biblioteca C torna impossível para expandir um bloco de memória no lugar, então C ++ não apoiá-lo também.

Se você quiser ficar com funções C, então você deve manter o ponteiro de seu primeiro alocação de memória ao chamar realloc (). Então você verificar se ele é NULL, caso contrário você atribuí-lo, assim como você fez em seu código latst.

Mas talvez para C ++ a melhor solução é fazer o seu próprio mallocator, a solução std baseado em malloc de C (). Verifique este , ou este .

Use a abordagem sugerida - mantenha o ponteiro para o buffer anterior até realloc voltou com sucesso. Uma vez que realloc () retorna com êxito o bloco anterior tenha sido libertado e todos os ponteiros para que se tornaram pendurado -. Ajustá-los

realloc, bem como malloc não importa o que é o tipo de ponteiro -. Você pode usar void *, bem como qualquer coisa *

Como já foi dito, apenas o uso realloc corretamente como sugerido.

Mas o "caminho C ++" de fazer isso é realmente usar um std :: vector <> em vez de manter matrizes si mesmo. Dessa forma, a biblioteca C ++ padrão vai cuidar dos detalhes de baixo nível de realocação (presumivelmente usando realloc ()).

Quando realloc () falha e retorna NULL a memória original é intocável.
Portanto, você deve usá-lo como este:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

Por que você está usando malloc e realloc? Há quase sempre uma maneira melhor em C ++.

Se você estiver usando-o para fazer matrizes de comprimento variável, você está quase certamente melhor fora com std :: vector <>, ou talvez um dos outros modelos de contêineres.

Se você estiver usando C em vez disso, talvez com um C ++ -. Compilador capaz, em seguida, o caminho correto é o segundo método, que não perde um bloco de memória inteira quando ele não consegue alocar

A resposta à sua segunda pergunta também depende se você estiver usando C ou C ++. Em C, void * é um tipo de ponteiro de dados genéricos, e é livremente conversível. Em C ++, necessidades void * para ser explicitamente convertido. Se você está realmente escrevendo C, você precisa usar malloc () e amigos, que trabalham em void *. Se você está realmente escrevendo C ++, você precisa elenco, o que torna mais difícil. Em nenhum dos casos, realloc () trabalho sobre ponteiros para struct, mas sim ponteiros para vazio.

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