Pergunta

Estou tocando com alocação dinâmica de memória "à mão" e queria ver como o posicionamento novo é implementado por caras do MS, mas quando a depuração eu "entrei em" ele me moveu para o código:

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}

Alguém poderia me explicar como diabos esse código coloca meu objeto no lugar apontado pelo meu ponteiro quando tudo o que eu posso ver neste código está em linha com a declaração de retorno com o que eu forneci como argumento. Eu não acho que dizer em comentar o que eu gostaria que essa FNC fizesse é realmente suficiente para que funcione. Obrigado por quaisquer respostas construtivas.

Foi útil?

Solução

O propósito de operator new é apenas alocar memória para um objeto e retornar o ponteiro a essa memória. Quando você usa o posicionamento novo, você está essencialmente dizendo ao compilador: "Eu sei que essa memória é boa, pule a alocação e usa esse ponteiro para o meu objeto". O construtor do seu objeto é então chamado usando o ponteiro fornecido por operator new Se foi ou não a memória que foi apenas alocada ou especificada usando o posicionamento novo. operator new A própria não tem influência sobre como seu objeto é construído.

Outras dicas

Lembre -se disso, o que new T(...) (chamado de "nova expressão") é duas coisas: alocando memória e inicialização de um objeto. Você pode ajustar a inicialização escrevendo construtores. Para a alocação que você escreve operator new. Então, apesar do nome, operator new apenas um lado do que uma nova expressão faz.

A colocação nova está lá para colocar um objeto na memória pré-alocada. Você não pode chamar construtores que passam diretamente a memória pré-alocada como um this ponteiro. A única coisa que você pode fazer é usar o posicionamento novo: isso transforma a alocação em um não-operatório, deixando apenas a construção a ser feita. este

inline void* operator new(size_t, void *p) throw()
{
  return p;
}

é apenas a implementação desse não-OP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top