Qual é a diferença entre o “novo” e “malloc” e “calloc” em C ++? [duplicado]
-
03-07-2019 - |
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?
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 comfree
. -
calloc
é comomalloc
mas inicializa a memória alocada com uma constante (0). Ele precisa ser liberado comfree
. -
new
inicializa a memória alocada chamando o construtor (se é um objeto). Memória alocada comnew
deve ser lançado comdelete
(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.