placement new e delete Conundrum
Em C , ao alocar memória com o operador location new, surge um dilema em relação ao método apropriado para desalocar essa memória. Vamos explorar duas possíveis soluções:
Solução 1:
const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;
Esta solução tenta excluir a memória alocada como um ponteiro de caractere. No entanto, essa abordagem é incorreta porque não trata adequadamente o destruidor do objeto nem desaloca a memória bruta.
Solução 2:
const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;
Esta solução também tenta excluir a memória alocada, mas chama diretamente o operador delete no ponteiro Buffer*. Isso funcionaria se a memória fosse alocada usando o novo operador regular. No entanto, como o posicionamento new foi usado, essa abordagem também está incorreta.
Solução correta:
O método correto para liberar a memória alocada é:
buf->~Buffer();
::operator delete(mem);
Esta solução chama explicitamente o destruidor do objeto Buffer (buf->~Buffer()) e então desaloca a memória bruta usando a função de exclusão do operador (::operator delete( mem)).
A distinção crítica aqui é que ao usar o posicionamento new, a função delete do operador deve ser chamada diretamente para liberar a memória bruta. A tentativa de excluir o ponteiro obtido do novo operador de posicionamento não invocará corretamente o destruidor nem desalocará totalmente a memória.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3