Qual é a diferença entre new / delete e malloc / free?


Respostas:


465

novo / excluir

  • Alocar / liberar memória
    1. Memória alocada no 'Free Store'
    2. Retorna um ponteiro totalmente digitado.
    3. new (versão padrão) nunca retorna um NULL (será lançado em caso de falha)
    4. São chamados com o Type-ID (o compilador calcula o tamanho)
    5. Tem uma versão explicitamente para manipular matrizes.
    6. A realocação (para obter mais espaço) não é manipulada intuitivamente (por causa do construtor de cópias).
    7. Se eles chamam malloc / free é a implementação definida.
    8. Pode adicionar um novo alocador de memória para lidar com pouca memória (set_new_handler)
    9. operador new / delete pode ser substituído legalmente
    10. construtor / destruidor usado para inicializar / destruir o objeto

malloc / grátis

  • Aloca / libera memória
    1. Memória alocada de 'Heap'
    2. Retorna um nulo *
    3. Retorna NULL em falha
    4. Deve especificar o tamanho necessário em bytes.
    5. A alocação de matriz requer cálculo manual de espaço.
    6. Realocando um pedaço maior de memória simples (não é necessário se preocupar com o construtor de cópias)
    7. Eles NÃO irão chamar novos / excluir
    8. Não há como dividir o código do usuário na sequência de alocação para ajudar com pouca memória.
    9. malloc / free NÃO pode ser substituído legalmente

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.


12
Alguém pode editar para elaborar a respeito da "Loja Grátis" em oposição à pilha? A pilha de um processo é um conceito bem conhecido no nível do sistema operacional, independente do idioma (?); de onde vem a "Free Store"?
einpoklum

1
@einpoklum: Eles são apenas nomes de áreas de memória. Nada tem a ver com o conceito de linguagem conhecido como "heap" ou com o conceito de "heap de processos". C ++ é deliberadamente definido como neutro de Platform / OS / Compiler. Portanto, o uso de um conceito específico de sistema operacional, como "pilha de processos", minaria a flexibilidade do padrão.
Martin York

4
@ Winterlight: Isso costumava ser verdade, mas não mais. Veja: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari Parece 'heap', 'free store' e 'dynamic memory / storage' são sinônimos: No A Tour of C ++ de Bjarne Stroustrup , ele diz "O newoperador 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."
Max Heiber

2
@heiber: Isso significa que eles podem ser os mesmos. E várias implementações implementam novas chamando malloc (observe que o contrário não é explicitamente permitido). Mas várias implementações mantêm essas áreas de memória completamente separadas. A razão pela qual eles também os mantiveram separados é que isso permite que o código de gerenciamento de memória C ++ seja otimizado de uma maneira diferente do gerenciamento de memória C. O ponto é: eles podem ser os mesmos, mas você não pode assumir que eles são.
Martin York

81

A diferença mais relevante é que o newoperador aloca memória e depois chama o construtor, e deletechama o destruidor e, em seguida, desaloca a memória.


22
A rigor, o novo operador apenas aloca a memória. É a nova expressão que chama o novo operador e, em seguida, executa o construtor na memória alocada.
Don Wakefield

Outra diferença é onde a memória está alocada. Vi recentemente em algum lugar que malloc / free opera na pilha, enquanto new / delete opera em outra área da memória cujo nome me escapa agora. (Basta dizer, porém, que outra área provavelmente pode ser pensado como uma outra pilha.)
RobH

2
@mgb: Sim, você está certo de que os objetos estão alocados na "pilha de aplicativos" ou na pilha. Mas @RobH está se referindo ao que o padrão chama de partes diferentes do "Application Heap". Existe o "Heap", onde o malloc aloca memória e o "Free Store", onde o novo aloca memória. Embora em algumas implementações essas áreas se sobreponham (este é um detalhe da implementação).
Martin Iorque

1
Sua declaração está 100% correta, mas simplesmente não responde à pergunta, veja a resposta abaixo; há uma razão pela qual ela tem mais votos do que o seu.
Murali

1
Tudo o que eu estava tentando dizer era que deveria haver pelo menos alguma menção ao malloc / free para que ele se qualificasse como uma comparação que faltava sua resposta. No entanto, é uma declaração relevante e precisa, portanto, os votos positivos, espero que você entenda meu ponto de vista. De qualquer forma, se o SO me permitisse retirar meu voto negativo, eu sinceramente o faria.
Murali

30

newchama o ctor do objeto, deletechame o dtor.

malloc& freeapenas aloque e libere memória não processada.


O que você quer dizer com memória não processada?
Destructor

3
A memória bruta não teve nada a ver com isso. Nenhum objeto foi construído nele ainda, nada foi copiado nele e, na maioria dos casos, o conteúdo anterior não foi substituído.
James Curran

14

new/ deleteé C ++, malloc/ freevem do bom e velho C.

No C ++, newchama um construtor de objetos e deletechama o destruidor.

malloce free, vindo da idade das trevas antes do OO, apenas aloque e libere a memória, sem executar nenhum código do objeto.


9
"Vindo da idade das trevas antes do OO" parece que você está sugerindo que o novo / excluir é melhor que o malloc / free quando, na realidade, nem é melhor nem pior, eles apenas têm usos diferentes. Note que eu não sou a pessoa que te decepcionou, só estou supondo.
Graeme Perrow

13

Em C ++ new/ deletechame o Construtor / Destrutor de acordo.

malloc/ freesimplesmente aloque memória da pilha. new/ deletealocar memória também.


10

As únicas semelhanças são que malloc/ newretornam 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/ deleteexecutar outros trabalhos arbitrário para além disso, através de construtores, destruidores e sobrecarga de operador. malloc/ freeapenas 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 newfaz.


7

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, mallocretorna objetos do tipovoid*

  • newlança uma exceção no erro, mallocretorna NULLe 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

  • mallocalocações derivadas podem ser redimensionadas via realloc, newalocações derivadas não podem ser redimensionadas

  • mallocpode alocar um pedaço de memória de N bytes, newdeve ser solicitado que aloque uma matriz de, digamos, chartipos

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.


5

Existem algumas coisas que newisso mallocnão funciona:

  1. new constrói o objeto chamando o construtor desse objeto
  2. new não requer conversão de tipo de memória alocada.
  3. Ele não requer que uma quantidade de memória seja alocada, mas requer que vários objetos sejam construídos.

Portanto, se você usar malloc, precisará fazer as coisas acima explicitamente, o que nem sempre é prático. Além disso, newpode estar sobrecarregado, mas mallocnão pode estar.

Em uma palavra, se você usa C ++, tente usar newo máximo possível.


4

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.


3

newe deletesã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).

malloce freesão funções C e alocam e liberam blocos de memória (em tamanho).

Ambos usam o heap para fazer a alocação. malloce, freeno 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).


1
new em C ++ não declara uma instância de uma classe. Ele (geralmente) aloca um da pilha e não declara nada. Você pode declarar uma instância apenas declarando-a; nesse caso, ela estará na pilha ou em globais, dependendo da duração do armazenamento da declaração.
Steve Jessop

Bem, ele aloca o espaço de memória para a classe, mas você não pode "declarar" uma classe na pilha, não no sentido real de armazenar a classe na pilha. A declaração envolve apenas o ponteiro para a classe que é sempre alocada na pilha, a memória real que contém a classe está na pilha.
Jorge Córdoba

Sim você pode. De acordo com as tags de pergunta, isso é C ++, para que os objetos possam ir para a pilha. E novo não é uma declaração, é uma expressão. Declarar algo e alocá-lo são coisas separadas.
Steve Jessop

2

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.


2
  • new é um operador, enquanto malloc () é uma função.
  • new retorna o tipo exato de dados, enquanto malloc () retorna void * (ponteiro do tipo void).
  • malloc (), a memória não é inicializada e o valor padrão é lixo, enquanto que no caso de novo, a memória é inicializada com valor padrão, como 'zero (0)' no caso de int.
  • delete e free () podem ser usados ​​para ponteiros 'NULL'.

0
  • Para usar o malloc(), precisamos incluir <stdlib.h> ou <alloc.h>no programa que não é necessário new.
  • newe deletepode ser sobrecarregado, mas mallocnão pode.
  • Usando o posicionamento new, podemos passar o endereço onde queremos alocar memória, mas isso não é possível no caso de malloc.

1
alloc.hnão é um cabeçalho padrão. <new>é necessário para usar o canal new.
MM

0

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

-3

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.