"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como desalocar corretamente a memória alocada com posicionamento novo em C++?

Como desalocar corretamente a memória alocada com posicionamento novo em C++?

Publicado em 2024-11-07
Navegar:633

How to Properly Deallocate Memory Allocated with Placement New in C  ?

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.

Tutorial mais recente Mais>

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