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*>(operatornew(100));
Também é possível sobrecarregar o operador novo globalmente ou para uma classe específica. IIRC, a assinatura é:
void*operatornew(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.
+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"
classFoo{public:void*operatornew(size_t);}
"novo operador":
Foo* foo =newFoo();
Neste exemplo, new Foo()chamadasFoo::operator new()
Em outras palavras, "novo operador" chama " operator new()", assim como o operador +operator +()
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.
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.
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.
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 =operatornew(sizeof(apple));//just like calling malloc()
apple* p2 =new(mem) apple(1);//call construct here using placement new.
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 *.
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
new é um operador, além de uma palavra-chave.
veja [1] em 2.13 e& em 2.12.
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.
Assim, o operador new faz parte das missões do new, e somente nesta parte podemos fazer alguma coisa.
new
operador. 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".Respostas:
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:Também é possível sobrecarregar o operador novo globalmente ou para uma classe específica. IIRC, a assinatura é:
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:
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.
fonte
operator delete(x);
."operador novo"
"novo operador":
Neste exemplo,
new Foo()
chamadasFoo::operator new()
Em outras palavras, "novo operador" chama "
operator new()
", assim como o operador +operator +()
fonte
new
não é um operador em C ++.sizeof
, por exemplo, é um operador, masnew
edelete
não é.new
edelete
sã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 .sizeof
é a construção sintáticanew
edelete
são operadores válidos, legais e com capacidade de sobrecarga. De tudo que eu já vi,new
edelete
são ambos operadores. Veja [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]operator new
função". Novamente,sizeof
é explicitamente referido como "operador", enquantonew
e nuncadelete
é referido como operador.A seguir, citação do livro More Effective C ++ de Scott Meyers:
fonte
Não há diferença entre "novo operador" e "operador novo". Ambos se referem à mesma coisa: a
operator new
funçã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
new
no seu programa para criar um objeto, ele é chamado de nova expressão . A nova expressão consiste em palavrasnew
- 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 new
função". Observe que as palavrasoperator
enew
nesta 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.
fonte
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.
fonte
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
2> 'operador novo' apenas aloca memória bruta, não há muita diferença do que malloc
fonte
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
fonte
::new(std::nothrow)
, podem fazer qualquer um (esse exemplo específico retorna um ponteiro nulo).new é um operador, além de uma palavra-chave.
veja [1] em 2.13 e& em 2.12.
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.
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º.
fonte