A memória perdida é liberada quando o programa é encerrado?

Respostas:

151

Sim, um "vazamento de memória" é simplesmente memória à qual um processo não tem mais uma referência e, portanto, não pode mais ser liberado. O sistema operacional ainda mantém registro de toda a memória alocada para um processo e a liberará quando o processo terminar.

Na grande maioria dos casos, o sistema operacional irá liberar a memória - como é o caso dos "tipos" normais de Windows, Linux, Solaris, etc. No entanto, é importante notar que em ambientes especializados, como vários sistemas operacionais em tempo real, o a memória pode não ser liberada quando o programa é encerrado.

Justin Ethier
fonte
4
Pergunta: O SO mantém registro de todas as alocações? Qualquer memória heap que você alocar vem do espaço de memória virtual do processo - quando o processo termina, esse espaço é devolvido ao sistema por atacado, certo? Não vejo por que a contabilidade extra seria necessária, uma vez que o processo que faz as alocações é o único processo (em userland) com acesso a essas páginas de qualquer maneira. Ou fui ensinado mal?
Chris Tonkinson
6
@ Justin: Sem conhecer o sistema operacional, não acho que isso seja válido. Talvez especifique explicitamente o sistema operacional sobre o qual você está falando.
Brian R. Bondy
1
Nota: o padrão não diz nada sobre isso. Também não é garantido. É assim que funciona na maioria, senão em todos, os SOs modernos, mas eles não precisam e no passado havia aqueles que eram comuns e não faziam essa limpeza.
Edward Strange
5
Existem vários sistemas operacionais em tempo real para pequenos dispositivos e assim por diante, que não recuperam a memória perdida em vazamentos. Sua pergunta depende do sistema operacional sobre o qual você está falando.
Brian Neal
14
Mesmo com sistemas operacionais protegidos por memória específica, você ainda precisa definir "vazamento". É muito possível que os aplicativos aloquem recursos do "sistema" fora de seu próprio espaço de memória (identificadores costumam ser usados ​​para identificá-los no mundo do Windows). Fechar seu aplicativo nem sempre garante que esses tipos de recursos sejam liberados.
David
34

O SO que executa seu programa geralmente limpa a memória que não é liberada explicitamente e controla que não são fechados explicitamente, mas isso não é garantido pelo padrão C ++. Você pode encontrar algum dispositivo embutido que não libera vazamentos de memória.

Dito isso, o Windows e todas as distros do Linux que eu já vi liberam vazamentos de memória.

Você pode facilmente criar um grande loop de vazamentos de memória para testá-lo você mesmo. Observe o uso de RAM aumentar e feche o programa. Você verá que o uso de RAM diminui.


Outra consideração ao usar C ++ é que, se você não estiver excluindo a memória alocada no heap, seus destruidores também não serão chamados. Às vezes, você também terá outros efeitos colaterais se seus destruidores não forem acionados.

Brian R. Bondy
fonte
14

Você está executando em um sistema operacional de desktop (Windows, Linux etc.)? Nesse caso, sim, em geral o sistema irá liberar qualquer memória associada ao programa quando o programa for encerrado.

Vicky
fonte
10

Normalmente sim. Alguns sistemas suportam coisas como blocos de memória compartilhada que não são liberados automaticamente quando um programa é encerrado. A maioria ainda mantém uma contagem de referência e a exclui quando todos os programas que a abriram fecham, mas alguns não (por exemplo, o Windows de 16 bits tinha alguns tipos de itens que permaneceriam alocados mesmo quando nada se referisse a eles - embora normalmente travava por outros motivos antes de acumular o suficiente para causar um problema ...)

Jerry Coffin
fonte
5

Pelo que eu sei, um sistema operacional moderno irá liberar essa memória assim que o programa terminar.

Ravibhagw
fonte
4

Depende de qual memória você vazou. Alguma memória não pode ser recuperada pelo sistema operacional. A maior parte da memória na maioria dos sistemas operacionais, no entanto, será recuperada automaticamente quando o processo for encerrado.

Cachorro
fonte
6
Alguma memória não pode ser recuperada pelo sistema operacional - como o quê?
2
Em alguns sistemas operacionais de tempo real, tenho visto blocos de buffer Ethernet especiais que não são limpos quando um processo é encerrado.
Brian Neal
1
A memória compartilhada geralmente não é recuperada, porque você pode querer que ela persista para uso de processos transitórios.
Brian Neal