Qual é a diferença entre o “novo” e “malloc” e “calloc” em C ++? [duplicado]

StackOverflow https://stackoverflow.com/questions/807939

Pergunta

O que é a diferença entre o "novo" e "malloc" e "calloc" e outros na família?

(Quando) que eu preciso de algo diferente de "novo"?

é um deles implementado usando qualquer outro?

Foi útil?

Solução

new e delete são características específicas C ++. Eles não existia em C. malloc é a maneira da velha escola C para fazer as coisas. Na maioria das vezes, você não vai precisar usá-lo em C ++.

  • Aloca memória malloc não inicializado. A memória alocada tem que ser lançado com free.
  • calloc é como malloc mas inicializa a memória alocada com uma constante (0). Ele precisa ser liberado com free.
  • new inicializa a memória alocada chamando o construtor (se é um objeto). Memória alocada com new deve ser lançado com delete (que por sua vez chama o destruidor). Ele não precisa de você para especificar manualmente o tamanho que você precisa e lançá-lo para o tipo apropriado. Assim, é mais moderno e menos propenso a erros.

Outras dicas

new / delete + new [] / delete []:

  • new / delete é o C ++ maneira de alocar a memória e desalocar memória do heap.
  • new [] e delete [] é o c ++ maneira de alocar matrizes de memória contígua.
  • Deve ser usado porque é mais seguro do que tipo malloc
  • Deve ser usado porque ele chama o construtor / destruidor
  • Não pode ser utilizado de uma forma realloc, mas pode usar posicionamento novo para re-utilizar o mesmo tampão de dados
  • Os dados não podem ser alocados com nova e libertou com livre, nem excluir []

malloc / free + família:

  • malloc / free / família é o caminho C para alocar e liberar memória do heap.
  • calloc é o mesmo que malloc mas também inicializa a memória
  • deve ser usado se você pode precisar de realocar a memória
  • Os dados não podem ser alocados com malloc e libertou com delete nem delete []

Veja também resposta relacionada minha aqui

  • novos aloca e chamadas para ctor (a ordem é não especificado), exclua o dtor e libera a memória alocada por uma chamada para novo
  • malloc única aloca alguma memória, sem exclusões memória alocada por malloc
  • novo pode ser implementado usando malloc (não é necessário que pelo padrão)
  • calloc faz a mesma coisa como malloc e também zeroizes a memória recém-alocado

Como outras Amarrar fora pontas:. Malloc / livre é parte do C ++ para ser compatível com C

Veja também: Stroustrup: novo vs malloc

Usando novos meios que os construtores vão ser chamados a memória recém-alocado. Se a coisa que está sendo alocado não tem construtores, novo é funcionalmente idêntico ao malloc. e normalmente deve ser usado em pereference a ele.

novo pode ou não ser implementado em termos de malloc -. O C ++ padrão não requer qualquer abordagem

Você não precisa de nada que não seja nova. É um substituto completo para malloc em C ++.

Quanto à diferença: Malloc apenas aloca memória. New alocado memória e chama os construtores. Da mesma forma livre apenas libera a memória. lançamentos excluir a memória e chama o destruidor.

Uma palavra de advertência: não se misturam os dois idiomas. Os resultados são indefinido.

A principal diferença entre o novo eo malloc me lembro é que você não pode memória realocar alocada pelo novo usando realloc. Então, se você queria aumentar / diminuir o tamanho do bloco de memória, você tinha que alocar um novo bloco e copiar tudo de novo.

calloc permite inicializar o bloco de memória que você alocar enquanto malloc não.

Quando você new um objeto, espaço para o objeto não só é alocado, mas o construtor do objeto é chamado. Mas este é o caminho C ++ seu feito, malloc é a versão antiga forma como C de alocação de memória. calloc é o mesmo que malloc , com exceção de que limpa a memória de todos os bits zero.

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