Pergunta

Estou recebendo a seguinte exceção quando eu executar o meu aplicativo no modo de versão do Visual C ++.

Exceção não tratada: System.AccessViolationException: Tentativa de ler ou escrever protegida memória. Isto é muitas vezes uma indicação que outra memória está corrompida. em _cexit () em .LanguageSupport._UninitializeDefaultDomain (void * Cookie) no .LanguageSupport.UninitializeDefaultDomain () em .LanguageSupport.DomainUnload (Object fonte, argumentos Eve ntArgs) em .ModuleUninitializer.SingletonDomainUnload (Objec t fonte, EventArgs argumentos)

Esta não acontece no modo de depuração. Inicialmente, eu vi essa exceção no meu computador de casa, mas não funcionar computador. Quando eu continuou a desenvolver no meu computador de trabalho, acabei batendo nele.

Além disso, descobri que quando eu adicionei três const std :: variáveis ??de string a exceção foi lançada. Se eu removido, em seguida, em seguida, tudo correu bem.

Outra informação: Descobri que desligar todas as otimizações do compilador no modo de versão faz com que a exceção ir embora

fishy Algo está acontecendo. Todas as ideias sobre como controlar isto?

Obrigado pela ajuda, Joe

Foi útil?

Solução

Joe, você tem um href="http://en.wikipedia.org/wiki/Memory_leak" rel="nofollow memória vazamento .

Você está provavelmente tentando usar alguma memória que foi apagado.

este artigo para causas comuns de vazamentos de memória, e como identificar -los, caso contrário, procure por "C ++ profiler de memória" + seu compilador / plataforma, ele vai dar links para perfis de memória adequados para o seu compilador e plataforma, estes vontade ajudar a rastrear o vazamento de memória, observando como a sua memória usos de programa como ele é executado .

Espero que isso ajude.

Editar

Como rastreá-lo? Esta é em cima da minha cabeça, pode haver um melhor aconselhamento mais onde. . .

Encontre onde o código de falha, vai ser ao acessar o conteúdo de algum ponteiro (ou excluir um ponteiro). O problema é que esse ponteiro tem tanto a) nunca foi atribuído b) já está eliminado. Passar por todas as referências a ponteiros desse tipo, eles são usados ??em cópia ctors / operadores de atribuição?

Se assim for, o seu conteúdo a ser copiado ou apenas o ponteiro? Se apenas o ponteiro, em seguida, é a classe que contém a tentar eliminar o ponteiro? Se assim for a primeira classe a morrer vai ter sucesso, o segundo irá lançar uma violação de acesso.

Se você não explicitamente ctors copiar o código e operador =, então você deve escondê-los (declarar protótipos privadas, mas não implementá-las), este pára o compilador de gerar implementações padrão para você.

Quando você escondê-los você vai ter erros do compilador em todos os lugares eles estão sendo usados, pode ser que você pode limpar estes acima, ou que você precisa para implementar o ctor cópia e operador = para cada classe.

Eu estou em férias de amanhã ou duas semanas, e-mail me hoje direta (siga o link na minha página de usuário SO) se você tiver alguma dúvida sobre este assunto.

Outras dicas

Você tem algum código que é #defined fora para debuging em seu código?

i.

#ifndef _DEBUG
   //release only code such as liscensing code
#endif

Isso é uma coisa que poderia estar causando o problema, e eu tenho que correr para isso antes também.

Outra possibilidade é uma questão VS (ou qualquer IDE que você está usando). Tente executar o lançamento .exe diretamente em vez de através do ambiente develoment e veja se você ainda tem o mesmo problema.

É um tempo desde que eu fiz C ++ "com raiva" por assim dizer, de modo algum (ou mesmo todos) do que eu digo abaixo pode muito bem estar fora de data.

Você está usando C ++ gerenciado? Se não, então ele soa como um ponteiro uninitialised. Ela costumava ser o caso que todos os ponteiros foram anulado na depuração & I lembrar algo sobre transformar este comportamento fora, mas eu não me lembro os detalhes completos no momento.

São as cordas ultrapassagem suas variáveis? Não com std :: string, mas vale a eliminação.

Os pares de possibilidades:

Eu acho que você está lendo / escrevendo passado local final array. Em compilações de depuração isso pode funcionar, como a memória não está bem alocada. Nas compilações este é mais propensos a causar problemas, depende do que é alocado ao lado da matriz.

Outra possibilidade é que você tem um lugar ponteiro não inicializado. VC padrão inicializa variáveis ??locais em modo de depuração, mas não no modo de versão. Assim código como:

int* p;
if (p != NULL) { /* do something */ }

Normalmente falhar no modo de versão.

A mensagem de erro está sugerindo fortemente que você tem um problema de memória, provavelmente substituindo memória. Estes são difíceis de encontrar, mas você pode encontrar algumas soluções possíveis googling "Visual C ++ memória da ferramenta corrupção".

A coisa sobre corrupção de memória é que é imprevisível. Ele não tem necessariamente quaisquer consequências, e se isso acontecer eles podem não resultar em um acidente. Quebrando como o que é bom, porque ele informa que você tem um problema.

brincando com liberação de depuração vs., adicionando ou removendo partes do código, alterando as opções de otimização e similares é improvável para resolver o problema. Mesmo se isso acontecer, é provável que surgir se as alterações são feitas.

Então, você tem um problema de corrupção de memória. Essas são quase sempre difíceis de encontrar, mas existem ferramentas. É preciso corrigir esse problema.

Você também pode olhar para as suas práticas de loja. Você usa construções menos seguros (arrays new em vez de vector<>, por exemplo)? Você tem padrões de codificação para tentar reduzir o risco? Você tem revisões de código? corrupção de memória pode ser insidioso e prejudicial, e você quer evitá-lo tanto quanto possível.

O seu recebendo é uma exceção de sistema a partir do OS. Estes não são tratados porque não são C ++ exceção. No entanto, você pode converter em seguida, em uma exceção de C ++ e pegá-los como uma exceção normal.

Há um grande artigo aqui http: //www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/ (página 3) que mostra como criar uma classe de exceção do Windows que irá capturar a exceção usando o método _set_se_translator e lançar uma excepção C ++. A grande coisa é que você pode ter uma pilha a partir da estrutura EXCEPTION_RECORD, embora your'll tem que adicionar essa funcionalidade para processar a estrutura, mas vai ajudar a estreitar sua busca para que a violação de acesso.

Eu acho que a questão aqui é não inicializado variável local. No modo de depuração geralmente as variáveis ??se inicializada e você não obter quaisquer excepções. Mas podem ocorrer erros no modo de versão por causa disso.

Tente olhar para variável não inicializada cujo acesso pode causar exceção.

Suponha que você tenha variável local boolean.

bool bRet;

Na compilação de depuração Bret vai ficar initailized a 0 e seu código apenas funciona bem.

Mas na liberação não será 0, seria algum valor aleatório e seu código poderia estar fazendo algo baseado em Bret .Ele pode mais tarde causa uma exceção porque o valor Bret está errado.

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