Pergunta

Duplicar de: Em que casos devo usar malloc vs novo?

Apenas re-ler esta pergunta:
Qual é a diferença entre " novo" e "malloc" e "calloc" em C ++?

Eu verifiquei as respostas, mas ninguém respondeu à pergunta:

  • Quando devo usar malloc em vez de novo?

Há um par de razões (que eu posso pensar de dois).
Deixe o melhor flutuar para o topo.

Foi útil?

Solução

Um casal que vêm à mente:

  • Quando você precisa de código para ser portátil entre C ++ e C.
  • Quando você está alocando memória em uma biblioteca que pode ser chamado de C, eo código C tem de libertar a alocação.

Outras dicas

A partir do Stroustrup FAQ sobre new/malloc eu postei nesse segmento:

Sempre que você usar malloc () você deve considerar a inicialização e conversão do ponteiro retorno a um tipo adequado. Você também terá que considerar se você tem o número de bytes certo para o seu uso. Não há diferença de desempenho entre malloc () e nova quando você toma a inicialização em conta.

Isso deve responder a sua pergunta.

A melhor razão que eu posso pensar para uso malloc em C ++ é quando interagindo com um C API puro. Alguns C APIs Eu trabalhei com a posse tomada da memória de certos parâmetros. Como tal, eles são responsáveis ??por liberar a memória e, portanto, a memória deve ser livre de poder via livre. Malloc irá trabalhar para isso puprose mas não necessariamente nova.

Em C ++, apenas sobre nunca. novo é geralmente um invólucro em torno malloc que chama construtores (se aplicável).

No entanto, pelo menos com o Visual C ++ 2005 ou melhor, usando malloc pode realmente resultar em vulnerabilidades de segurança mais nova .

Considere este código:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

Eles olham equivelent. No entanto, o codegen para os primeiro, na verdade verifica um excesso de número inteiro em count * sizeof(MyStruct). Se a contagem vem de uma fonte unstrusted, pode causar um estouro de inteiro, resultando em uma pequena quantidade de memória que está sendo alocado, mas, em seguida, quando você usa contar você saturar o buffer.

Todo mundo tem mencionado (usando palavras ligeiramente diferentes) ao usar uma biblioteca C que vai usar free () e há um monte de pessoas à sua volta.

A outra situação que eu vejo é:

Quando witting seu próprio gerenciamento de memória (porque, por algum motivo que você descobriu através de modelagem do padrão não é bom o suficiente). Você poderia alocar bloco de memória com malloc ea inicialização dos objetos dentro dos pools usando posicionamento novo.

Uma das razões é que em C ++, você pode sobrecarregar o novo operador.

Se você quiser ter certeza de usar a alocação de memória biblioteca do sistema no seu código, você poderia usar malloc.

programador A C ++ deve raramente, se alguma vez precisar de malloc chamada. A única razão para fazê-lo que eu posso pensar seria uma API mal construídas que se espera que você passe na memória malloc porque ele estaria fazendo o livre. Em seu próprio código, novo deve ser sempre igual a malloc.

Se a memória estiver a ser lançado pela free () (no seu ou código elses alguém), é muito danado necessário para usar malloc.

Caso contrário, eu não tenho certeza. Um caso artificial é quando você não quer destructor (s) para ser executado na saída, mas, nesse caso, você provavelmente deve ter objetos que têm uma dtor não-op de qualquer maneira.

Você pode usar malloc quando você não quer ter que se preocupar com a captura de exceções (ou use uma versão não jogando de novo).

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