Qual é a diferença entre new
/ delete
e malloc
/ free
?
Relacionado (duplicado?): Em que casos eu uso malloc vs new?
c++
memory-management
MrDatabase
fonte
fonte
Respostas:
novo / excluir
malloc / grátis
Tabela de comparação dos recursos:
Tecnicamente, a memória alocada por new vem do 'Free Store', enquanto a memória alocada pelo malloc vem do 'Heap'. Se essas duas áreas são iguais, é um detalhe da implementação, que é outro motivo pelo qual malloc e new não podem ser misturados.
fonte
If ptr is NULL, no operation is performed.
new
operador aloca memória do free store (também conhecido como memória dinâmica"). e pilha ). O C ++ 14 padrão, seção 3.7.4 sobre armazenamento dinâmico diz: "Os objetos podem ser criados dinamicamente durante a execução do programa (1.9), utilizando novas-expressões (5.3.4), e destruiu usando de exclusão de expressões."A diferença mais relevante é que o
new
operador aloca memória e depois chama o construtor, edelete
chama o destruidor e, em seguida, desaloca a memória.fonte
new
chama o ctor do objeto,delete
chame o dtor.malloc
&free
apenas aloque e libere memória não processada.fonte
new
/delete
é C ++,malloc
/free
vem do bom e velho C.No C ++,
new
chama um construtor de objetos edelete
chama o destruidor.malloc
efree
, vindo da idade das trevas antes do OO, apenas aloque e libere a memória, sem executar nenhum código do objeto.fonte
Em C ++
new
/delete
chame o Construtor / Destrutor de acordo.malloc
/free
simplesmente aloque memória da pilha.new
/delete
alocar memória também.fonte
As únicas semelhanças são que
malloc
/new
retornam um ponteiro quais endereços alguma memória na pilha, e ambos garantia de que uma vez que um tal bloco de memória foi devolvido, não vai ser devolvido novamente a menos que você livre / excluí-lo primeiro. Ou seja, ambos "alocam" memória.No entanto,
new
/delete
executar outros trabalhos arbitrário para além disso, através de construtores, destruidores e sobrecarga de operador.malloc
/free
apenas aloque e libere memória.De fato,
new
é suficientemente personalizável para não necessariamente devolver a memória do heap, nem sequer alocar memória. No entanto, o padrãonew
faz.fonte
A principal diferença entre new e malloc é que new chama o construtor do objeto e a chamada correspondente a excluir chama o destruidor do objeto.
Existem outras diferenças:
new
é seguro para o tipo,malloc
retorna objetos do tipovoid*
new
lança uma exceção no erro,malloc
retornaNULL
e define errnonew
é um operador e pode ser sobrecarregado,malloc
é uma função e não pode ser sobrecarregadonew[]
, que aloca matrizes, é mais intuitivo e seguro para tipos do quemalloc
malloc
alocações derivadas podem ser redimensionadas viarealloc
,new
alocações derivadas não podem ser redimensionadasmalloc
pode alocar um pedaço de memória de N bytes,new
deve ser solicitado que aloque uma matriz de, digamos,char
tiposObservando as diferenças, um resumo é malloc e C-esque, o novo é C ++-esque. Use o que achar melhor para sua base de código.
Embora seja legal que o novo e o malloc sejam implementados usando algoritmos diferentes de alocação de memória, na maioria dos sistemas novos é implementado internamente usando o malloc, não produzindo diferença no nível do sistema.
fonte
Existem algumas coisas que
new
issomalloc
não funciona:new
constrói o objeto chamando o construtor desse objetonew
não requer conversão de tipo de memória alocada.Portanto, se você usar
malloc
, precisará fazer as coisas acima explicitamente, o que nem sempre é prático. Além disso,new
pode estar sobrecarregado, masmalloc
não pode estar.Em uma palavra, se você usa C ++, tente usar
new
o máximo possível.fonte
Além disso,
o novo global e a exclusão podem ser substituídos, malloc / free não.
ainda mais novos e excluir podem ser substituídos por tipo.
fonte
new
edelete
são primitivas em C ++ que declaram uma nova instância de uma classe ou a excluem (chamando assim o destruidor da classe para a instância).malloc
efree
são funções C e alocam e liberam blocos de memória (em tamanho).Ambos usam o heap para fazer a alocação.
malloc
e,free
no entanto, são mais "de baixo nível", pois apenas reservam um pedaço de espaço de memória que provavelmente será associado a um ponteiro. Nenhuma estrutura é criada em torno dessa memória (a menos que você considere uma matriz C uma estrutura).fonte
new e delete são operadores em c ++; que pode ser sobrecarregado também. malloc e free são funções em c;
malloc retorna nulo ptr quando falha enquanto novo lança exceção.
o endereço retornado pelo malloc precisa ser convertido novamente pelo tipo convertido, pois retorna o malloc (tamanho *) (void *) New, retornando o ponteiro digitado.
fonte
fonte
malloc()
, precisamos incluir<stdlib.h>
ou<alloc.h>
no programa que não é necessárionew
.new
edelete
pode ser sobrecarregado, masmalloc
não pode.new
, podemos passar o endereço onde queremos alocar memória, mas isso não é possível no caso demalloc
.fonte
alloc.h
não é um cabeçalho padrão.<new>
é necessário para usar o canal new.Este código para uso da palavra-chave delete ou da função free. Porém, ao criar um objeto ponteiro usando 'malloc' ou 'new' e desalocar a memória do objeto usando delete, mesmo esse ponteiro de objeto pode ser uma função de chamada na classe. Depois disso, use free em vez de delete e também funciona após a instrução free, mas quando os dois são usados, apenas o objeto ponteiro não pode chamar para funcionar na classe .. o código é o seguinte:
fonte
1.novo syntex é mais simples que malloc ()
2.new/delete é um operador em que malloc () / free () é uma função.
3.new/delete executa mais rápido que malloc () / free () porque o novo código de montagem é diretamente colado pelo compilador.
4.nós podemos alterar o novo / excluir significado no programa com a ajuda do operador.
fonte