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

Qual é a diferença entre “novo” e “malloc” e “calloc” e outros na família?

(Quando) Preciso de algo diferente de “novo”?

Um deles é implementado usando qualquer outro?

new e delete são resources específicos do C ++. Eles não existiam em C. malloc é a maneira antiga de fazer as coisas. Na maioria das vezes, você não precisará usá-lo em C ++.

  • malloc aloca memory não inicializada. A memory alocada deve ser liberada free .
  • calloc é como malloc mas inicializa a memory alocada com uma constante (0). Precisa ser libertado de free .
  • new inicializa a memory alocada chamando o construtor (se for um object). Memória alocada com o new deve ser liberada com delete (que por sua vez chama o destruidor). Ele não precisa que você especifique manualmente o tamanho necessário e transmita-o para o tipo apropriado. Assim, é mais moderno e menos propenso a erros.

novo / excluir + novo [] / excluir []:

  • new / delete é a maneira C ++ de alocar memory e desalocar memory do heap.
  • new [] e delete [] é a maneira c ++ de alocar matrizes de memory contígua.
  • Deve ser usado porque é mais seguro do que o malloc
  • Deve ser usado porque chama o construtor / destruidor
  • Não pode ser usado de forma real, mas pode usar o posicionamento novo para reutilizar o mesmo buffer de dados
  • Os dados não podem ser alocados com new e liberados com free, nem delete []

malloc / free + family:

  • malloc / free / family é a maneira C de alocar e liberar memory do heap.
  • calloc é o mesmo que malloc mas também inicializa a memory
  • Deve ser usado se você precisar realocar a memory
  • Os dados não podem ser alocados com malloc e liberados com delete nem delete []

Veja também minha resposta relacionada aqui

  • novas alocações e chamadas para ctor (a ordem não é especificada), exclua o dtor e libere a memory alocada por uma chamada para
  • malloc aloca apenas alguma memory, livre exclui memory alocada por malloc
  • novo pode ser implementado usando malloc (não exigido pelo padrão)
  • calloc faz a mesma coisa que malloc e também zera a memory recém alocada

Como outros posts apontaram: malloc / free faz parte do C ++ para ser compatível com C.

Veja também: Stroustrup: new vs malloc

Usar new significa que os construtores serão chamados na memory recém alocada. Se a coisa que está sendo alocada não tiver construtores, o novo é funcionalmente idêntico ao malloc. e normalmente deveria ser usado em pereference para isto.

new pode ou não ser implementado em termos de malloc – o padrão C ++ não requer nenhuma das abordagens.

Você não precisa de nada além de novo. É um substituto completo para malloc em C ++.

Quanto à diferença: Malloc apenas aloca memory. Nova memory alocada e chama os construtores. Da mesma forma livre apenas libera a memory. Delete libera a memory e chama o destruidor.

Uma palavra de aviso: não misture as duas expressões idiomáticas. Os resultados são indefinidos.

a principal diferença entre new e malloc que eu posso lembrar é que você não pode realocar memory alocada por new usando realloc. Então, se você quisesse aumentar / diminuir o tamanho do bloco de memory, teria que alocar um novo bloco e copiar tudo.

Calloc permite inicializar o bloco de memory que você aloca enquanto malloc não o faz.

Quando você cria um novo object, o espaço para o object não é alocado apenas, mas o construtor do object é chamado. Mas esta é a maneira C ++ seu feito, malloc é a maneira de versão antiga em C de alocação de memory. calloc é o mesmo que malloc , exceto por limpar a memory para todos os bits zero.