Pergunta

Recentemente, eu trabalho em um programa leitor de vídeo no Windows para um programa CCTV. Como o programa tem de descodificar e jogar muitos vídeos córregos, ao mesmo tempo, eu acho que pode atender à situação que malloc irá falhar e eu adicionar verificação após cada malloc.

Mas genrally falando, nestes código de programas de código aberto que eu li em projetos de código aberto, eu raramente encontrar qualquer verificação de resultado de malloc. Então, quando malloc falhar, a maioria programa só irá falhar. Não é que unacceptalbe?

Os meus colegas que escrevem programas de servidor em Linux vai alloc uma memória suficiente para 100 conexões do cliente. Assim, embora o seu programa pode recusar o cliente 101, ele nunca vai encontrou uma falha de malloc. É a sua abordagem também adequado para aplicações desktop?

Foi útil?

Solução

No Linux, malloc() nunca falhará - em vez disso, o assassino OOM será acionado e começar a matar processos aleatórios até que o sistema cai. Desde que o Linux é o derivado mais UNIX popular em uso hoje, muitos desenvolvedores têm aprendido a apenas nunca verificar o resultado da malloc(). Isso é provavelmente porque seus colegas ignorar falhas malloc().

Em sistemas operacionais que falhas de apoio, eu vi dois padrões gerais:

  • Escrever um procedimento personalizado que verifica o resultado de malloc(), e chamadas abort() se a alocação falhou. Por exemplo, o GLib e GTK + bibliotecas usar essa abordagem.

  • loja uma lista global de alocações "Purifica-capazes", como caches, que podem ser compensados ??em caso de falha de alocação. Em seguida, tente a alocação de novo, e se ele ainda falhar, relatá-lo através dos mecanismos de notificação de erro padrão (que não realizam a alocação dinâmica).

Outras dicas

Siga o padronizado API

Mesmo em Linux, ulimit pode ser usado para obter um retorno de erro malloc pronta. É que o padrão é ilimitado.

Há uma pressão definida em conformidade com normas publicadas. Na maioria dos sistemas, a longo prazo, e, eventualmente, até mesmo em Linux, malloc(3) irá retornar uma indicação correcta de falha. É verdade que os sistemas de desktop tem memória virtual e paginação por demanda, mas mesmo assim não verificar malloc(3) só funciona em um programa depurado sem vazamentos de memória. Se alguma coisa der errado, alguém vai querer definir um ulimit e segui-lo para baixo. De repente, a verificação malloc faz sentido.

Para usar o resultado de malloc sem verificar nulo é inaceitável em código que pode ser aberta para uso em plataformas onde malloc pode falhar, sobre aqueles que tendem a resultar em acidentes e comportamentos imprevisíveis. Eu não posso prever o futuro, não sei onde meu código vai, então eu iria escrever código com cheques para malloc retornando null - melhor morrer do que se comportam unpredicatbly

Estratégias para o que fazer se malloc falha dependem do tipo de applciation e quanta confiança você tem nas bibliotecas que você está usando. Ele algumas situações a única coisa segura a fazer é parar todo o programa.

A idéia de preallocating uma cota conhecida de memória e parcelamento em alguns pedaços, daí orientação clara de realmente esgotar o memeory é uma boa, se o uso de memória do seu aplicativo é predicatable. Você pode estender isso para escrever suas próprias rotinas de gerenciamento de memória para uso por seu código.

Depende do tipo de aplicação que você está trabalhando. Se o aplicativo faz o trabalho que é dividido em tarefas distintas, onde uma tarefa individual pode ser permitido falhar, em seguida, verificar as alocações de memória podem ser recuperados adequadamente.

Mas em muitos casos, a única maneira razoável para responder a uma falha malloc é por que encerra o programa. Permitindo que o seu código para apenas acidente na dereference nulo inevitável vai conseguir isso. Seria certamente ser sempre melhor para despejar uma mensagem entrada de log ou de erro explicando o erro, mas no mundo real que trabalhar em horários limitados. Às vezes, o retorno sobre o investimento de tratamento de erros pedante não está lá.

seleção Sempre e pré-alocar um buffer que pode ser liberado neste caso para que possa avisar o usuário para salvar seus dados e encerrar a aplicação.

Depende do aplicativo que você escreve. Claro que você sempre precisa verificar o valor de retorno de malloc (). No entanto, a manipulação OOM graciosamente só faz sentido em muito casos, tais como serviços de sistema cruciais de baixo nível, ou ao escrever uma biblioteca que pode ser usado ser eles. Ter um malloc invólucro que aborts no OOM é, portanto, muito comum em muitos aplicativos e frameworks. Muitas vezes, esses invólucros são nomeados xmalloc () ou similar.

g_malloc do GLib () é abortar, também.

Se você estiver indo para lidar com grandes quantidades de memória, e quer fazer declarações para o Linux como "agora eu tenho área de memória ABC e eu não preciso a peça B, fazer o que quiser", ter um olhar para mmap () / madvise () família de funções disponíveis na biblioteca Stock GNU C. Dependendo de seus padrões de uso, o código pode acabar ainda mais simples do que usar malloc. Esta API também pode ser usado para ajudar a Linux não perca de memória, cache de arquivos que você está indo para ler / escrever apenas uma vez.

Eles estão bem documentados em GNU libc documentação info.

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