Pergunta

Eu tenho um aplicativo que aloca memória com 'novo' e os libera com 'excluir' em algumas partes do código. O problema é que sempre que excede o limite de memória do sistema (digamos 2 GB), o Windows envia um sinal de morte para o processo. Eu acho que não é comum, pois deve usar o espaço de troca (acho que no Windows é chamado de memória virtual), certo? Meu aplicativo está escrito no C ++/Visual Studio.

Foi útil?

Solução

Aqui está como você pode chegar a 3 GB para um processo; Esse é o máximo absoluto que você pode tê -lo para aplicativos Windows de 32 bits. Mais do que isso e você precisará usar uma versão de 64 bits do Windows.

Isso é muita memória. Talvez você possa considerar dividir seu aplicativo em vários processos e se comunicar entre eles.

Outras dicas

O sistema operacional não mata seu aplicativo, uma exceção não tratada faz. Você deseja examinar seu aplicativo com o Perfmon e assistir a esses contadores, conjunto de trabalho, bytes virtuais, bytes privados. Você terá exceções quando seus bytes reservados chegarem perto de 2 GB. Portanto, seus bytes comprometidos e bytes de RAM são muito menores.

Aqui está um bom artigo sobre o espaço de endereço virtual, incluindo vs comprometido.

A moral da história, não tente alocar quando os bytes reservados se aproximam de 2 GB, para um processo de 32 bits.

O Windows não usa sinais. Você deve obter a exceção do std :: badalloc quando ficar sem memória. Que, quando não capturado, executará automaticamente a função termine (). A exceção é visível na janela de saída.

Eu não olhei muito de perto, mas você pode encontrar as respostas que deseja aqui:

Você pode alocar um único pedaço de memória muito grande (> 4 GB) em C ou C ++?

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