Qual é a diferença entre new
/ delete
e malloc
/ free
?
Relacionado (duplicado?): Em que casos eu uso malloc vs new?
Qual é a diferença entre new
/ delete
e malloc
/ free
?
Relacionado (duplicado?): Em que casos eu uso malloc vs new?
Respostas:
Tabela de comparação dos recursos:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
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.
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, e delete
chama o destruidor e, em seguida, desaloca a memória.
new
chama o ctor do objeto, delete
chame o dtor.
malloc
& free
apenas aloque e libere memória não processada.
new
/ delete
é C ++, malloc
/ free
vem do bom e velho C.
No C ++, new
chama um construtor de objetos e delete
chama o destruidor.
malloc
e free
, vindo da idade das trevas antes do OO, apenas aloque e libere a memória, sem executar nenhum código do objeto.
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.
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ão new
faz.
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
retorna NULL
e define errno
new
é um operador e pode ser sobrecarregado, malloc
é uma função e não pode ser sobrecarregado
new[]
, que aloca matrizes, é mais intuitivo e seguro para tipos do que malloc
malloc
alocações derivadas podem ser redimensionadas via realloc
, new
alocações derivadas não podem ser redimensionadas
malloc
pode alocar um pedaço de memória de N bytes, new
deve ser solicitado que aloque uma matriz de, digamos, char
tipos
Observando 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.
Existem algumas coisas que new
isso malloc
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, mas malloc
não pode estar.
Em uma palavra, se você usa C ++, tente usar new
o máximo possível.
new
e delete
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
e free
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).
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.
malloc()
, precisamos incluir <stdlib.h>
ou
<alloc.h>
no programa que não é necessário new
.new
e delete
pode ser sobrecarregado, mas malloc
não pode.new
, podemos passar o endereço onde queremos alocar memória, mas isso não é possível no caso de malloc
.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:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
resultado :
Hello Hi 0x2abfef37cc20
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.