Diferença entre 'novo operador' e 'novo operador'?

126

Qual é a diferença entre "new operator" e "operator new"?

Sandeep
fonte
3
Olá, você pode esclarecer a pergunta? Parece que há erro de digitação em algum lugar.
Dima Malenko
17
A pergunta está redigida corretamente, veja as respostas abaixo. O método para alocar memória dinamicamente é usar o newoperador. Este operador pode estar sobrecarregado. Para distinguir entre o operador padrão e uma versão sobrecarregada, o padrão é chamado "novo operador" e a versão sobrecarregada é chamada "operador novo".
55678 Thomas
2
Como fazer isso. Eu sou novo e inconsciente.
Sandeep

Respostas:

127

Normalmente, tento definir as coisas de maneira diferente para diferenciar um pouco melhor as duas, mas, de qualquer forma, é uma boa pergunta.

Operador novo é uma função que aloca memória não processada - pelo menos conceitualmente, não é muito diferente malloc(). Embora seja bastante incomum, a menos que você esteja escrevendo algo como seu próprio contêiner, você pode chamar o operador novo diretamente, como:

char *x = static_cast<char *>(operator new(100));

Também é possível sobrecarregar o operador novo globalmente ou para uma classe específica. IIRC, a assinatura é:

void *operator new(size_t);

Obviamente, se você sobrecarregar um operador novo (global ou para uma classe), também precisará / precisará sobrecarregar o operador correspondente. Pelo que vale, há também um operador separado novo [] usado para alocar memória para matrizes - mas é quase certo que você ignore completamente toda essa bagunça.

O novo operador é o que você normalmente usa para criar um objeto a partir da loja gratuita:

my_class *x = new my_class(0);

A diferença entre os dois é que o operador new apenas aloca memória não processada, nada mais. O novo operador começa usando o operador new para alocar memória, mas, em seguida, chama o construtor para o tipo certo de objeto, portanto, o resultado é um objeto ativo real criado nessa memória. Se esse objeto contiver outros objetos (incorporados ou como classes base), esses construtores também serão chamados.

Jerry Coffin
fonte
18
+1, quanto a um fraseado diferente, o padrão usa nova expressão ao redor e apenas uma vez que usa o novo operador para se referir ao local da chamada. Costumo fazer o mesmo: operador novo para o alocador e nova expressão para o uso.
David Rodríguez - dribeas
3
Uma nova expressão é a frase inteira que começa com nova. Então, como você chama apenas a parte "nova"? Se estiver errado chamar isso de novo operador, não devemos chamar "sizeof" o tamanho do operador ou & o endereço do operador (quando ele se comportar como um).
Kaz
1
Seguindo a observação de Kaz, talvez a pergunta deva ser reformulada como: qual é a diferença entre o novo operador e o novo operador? :)
CS
2
"operador novo" vs "nova palavra-chave"
user997112 08/08
2
@ antred: Você liberaria isso com algo parecido operator delete(x);.
Jerry Coffin
35

"operador novo"

class Foo
{
public:
        void* operator new( size_t );
}

"novo operador":

Foo* foo = new Foo();

Neste exemplo, new Foo()chamadasFoo::operator new()

Em outras palavras, "novo operador" chama " operator new()", assim como o operador +operator +()

Austin Hyde
fonte
13
newnão é um operador em C ++. sizeof, por exemplo, é um operador, mas newe deletenão é. newe deletesão palavras-chave e as construções sintáticas que essas palavras-chave formam são chamadas de nova expressão e expressão de exclusão .
11/09/09
2
Uh, se alguma coisa, sizeofé a construção sintática newe deletesão operadores válidos, legais e com capacidade de sobrecarga. De tudo que eu já vi, newe deletesão ambos operadores. Veja [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
Austin Hyde
7
Incorreta. A terminologia oficial do C ++ é a terminologia definida pela especificação da linguagem, não por algum site. Na especificação da linguagem, não existe um termo como "novo operador", mas existe um termo como " operator newfunção". Novamente, sizeofé explicitamente referido como "operador", enquanto newe nuncadelete é referido como operador.
11/11/09
6
AndreyT: Incorreto. O padrão C ++ chama 'novo' de operador, consulte 13.5 / 1.
3
@ AndreyT: Pensei, como você pensa, que o novo operador era o alocador e a nova expressão dos usos. Revi e verifiquei que, em §5.3.4 / 3, o padrão atual usa o termo novo operador . Mais tarde, em §5.3.4 / 8 nomeia as funções alocador como novo operador e operador new []
David Rodríguez - dribeas
22

A seguir, citação do livro More Effective C ++ de Scott Meyers:

O novo operador chama uma função para executar a alocação de memória necessária e você pode reescrever ou sobrecarregar essa função para alterar seu comportamento. O nome da função que o novo operador chama para alocar memória é operador novo.

Naveen
fonte
7
O termo é obviamente inventado pelo autor do livro (ou, talvez, emprestado de alguma fonte obsoleta). Na nomenclatura C ++ formal, não existe o termo "novo operador".
11/09/09
2
@ AndreyT: Eu fiz uma pesquisa no C ++ 11 por "novo operador" e o encontrei referenciado em quatro locais. Especificamente, duas referências ao "operador novo posicionamento"
Mooing Duck
11

Não há diferença entre "novo operador" e "operador novo". Ambos se referem à mesma coisa: a operator newfunção sobrecarregável / substituível que normalmente executa alocação de memória bruta para objetos criados por novas expressões .

Observe também que nenhum dos termos está presente na especificação do idioma (que é a fonte que define a terminologia oficial).

Quando você usa newno seu programa para criar um objeto, ele é chamado de nova expressão . A nova expressão consiste em palavras new- chave e partes sintáticas adicionais definidas pela gramática. Nenhuma parte da sintaxe dessa expressão é chamada de "operador".

A função de alocação de memória bruta operator newé oficialmente referida como apenas " operator newfunção". Observe que as palavras operatore newnesta sequência são apenas duas palavras-chave separadas da linguagem C ++. Eles não formam o termo em inglês "operador novo". Em nenhum lugar da especificação do idioma você encontrará referências a "operator new" como um termo em inglês. Sempre que isso é apenas uma combinação de duas palavras-chave independentes que produzem sintaxe de declaração para uma função de alocação de memória.

Novamente, em resumo: formalmente em C ++ não existem termos no idioma inglês como "operador novo" ou "novo operador". A sequência anterior está presente na especificação do idioma como uma mera combinação de palavras-chave, não como um termo em inglês. Este último não está presente.

Formiga
fonte
14
Você parece perdido em alguma masturbação mental pedante. O padrão é vago em alguns pontos, e este é um deles. Faz tanto sentido "discutir o novo operador" quanto "discutir o operador positivo" ou "discutir o operador +".
7

Quando você cria um novo objeto, a memória é alocada usando o operador new, em seguida, o construtor é chamado para inicializar a memória. O novo operador faz a alocação e a inicialização, enquanto o novo operador faz apenas a alocação.

Chris Fulstow
fonte
6

A pergunta do OP não foi formulada corretamente. É melhor passar de 'Diferença entre' operador novo 'e' nova expressão '?' Nota 'operador novo' também se refere a 'nova função do operador'.

E há muitas respostas corretas por aí, abaixo está a minha:

1> 'new expression' call 'operator new' para alocar memória não processada, depois chame o construtor

apple * p = new apple(); //new expression

2> 'operador novo' apenas aloca memória bruta, não há muita diferença do que malloc

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.
Gob00st
fonte
2

O novo operador : C ++ suporta alocação dinâmica de objetos usando o novo operador. O novo operador aloca memória para objetos de um pool chamado armazenamento gratuito. O novo operador chama o operador de função especial como novo.

operador novo : se a solicitação for zero bytes de armazenamento, o operador novo retornará um ponteiro para um objeto distinto (ou seja, chamadas repetidas para o operador novo retornarão ponteiros diferentes). Se houver memória insuficiente para a solicitação de alocação, o operador new retornará NULL ou emitirá uma exceção. O primeiro argumento para o operador new deve ser do tipo size_t (um tipo definido em STDDEF.H) e o tipo de retorno é sempre nulo *.

Aqui estão os links do MSDN para mais detalhes:

O novo operador Função

O novo Operador

aJ.
fonte
1
Esclarecimento leve: o novo operador que não é de colocação deve sempre apresentar falha na alocação (de acordo com a norma); e formulários de posicionamento, como, por exemplo ::new(std::nothrow), podem fazer qualquer um (esse exemplo específico retorna um ponteiro nulo).
1
  1. new é um operador, além de uma palavra-chave.

    veja [1] em 2.13 e& em 2.12.

  2. new faz duas coisas: T * t = new T (arg);

    1) alocar memória para o objeto: void * ptr = operador new (sizeof (T));

    // operador new é uma função (assim como malloc em c), não um operador (consulte [1] em 3.7.4). Mas o item 7 [2] disse que também é um operador. Na minha opinião, a diferença entre operador e função é pequena, e você pode vê-lo quando se lembra que o operador de sobrecarga é implementado por funções.

    // podemos sobrecarregar esse operador / função (operador novo) fazendo o que queremos aqui.

    2) inicialize o objeto na memória alocada: chame T :: T (arg) no ptr

    // somente o compilador pode fazer isso. Nem eu nem você.

    // também o compilador chamará os construtores dos objetos membros e o construtor da classe base se T os tiver. E essa invocação é recursiva. Somente o compilador pode fazer isso.

  3. Assim, o operador new faz parte das missões do new, e somente nesta parte podemos fazer alguma coisa.

    [1]: ISO / IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]: Meyers, Scott. C ++ efetivo, 3º.

njuhgn
fonte