Pergunta

Eu fiz uma pergunta semelhante um par de dias atrás, mas eu estou procurando mais insight. Estou recebendo uma AccessViolationException quando eu adiciono uma string para o meu programa:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at _cexit()
   at <CrtImplementationDetails>.LanguageSupport._UninitializeDefaultDomain(Void * cookie)
   at <CrtImplementationDetails>.LanguageSupport.UninitializeDefaultDomain()
   at <CrtImplementationDetails>.LanguageSupport.DomainUnload(Object source, EventArgs arguments)
   at <CrtImplementationDetails>.ModuleUninitializer.SingletonDomainUnload(Object source, EventArgs arguments)

O programa tem um monte de std :: string const de no nível superior:

const std::string caseDelimitedOption = "CaseDelimited";
const std::string endOfLineOption = "EndOfLine";
const std::string functionNameDelimitWordsOption = "FunctionNameDelimitWords";
const std::string functionNameStartCaseOption = "FunctionNameStartCase";
const std::string indentStringOption = "IndentString";
const std::string lowerCaseOption = "LowerCase";
const std::string newLineBetweenDoAndWhileOption = "NewLineBetweenDoAndWhile";
const std::string nextLineOption = "NextLine";
const std::string nextLineAsWellAsCloseParenOption = "NextLineAsWellAsCloseParen";
const std::string noBracesAroundSingleStatementBlockOption = "NoBracesAroundSingleStatementBlock";
const std::string openBraceLocationOption = "OpenBraceLocation";
const std::string underscoreDelimitedOption = "UnderscoreDelimited";
const std::string upperCaseOption = "UpperCase";
const std::string whiteSpaceBeforeLeadingCmntOption = "WhiteSpaceBeforeLeadingComment";

Se eu substituir última string com:

const std::string whiteSpaceBeforeLeadingCmntOption = ""; //"WhiteSpaceBeforeLeadingComment";

, em seguida, a exceção vai embora. É essa memória extra apenas (a partir da string) bater alguma má memória que foi causado em outros lugares no meu programa? Ou é a excepção relacionada com a corda?

Obrigado por qualquer ajuda,

Joe

Foi útil?

Solução

Eu assumo essas cadeias são variáveis ??globais.

Você está tentando acessar essas cordas a partir do construtor de outra variável global (ou de algum método que é chamado antes principal está inserido)?

Se este for o caso você está sofrendo com a probelem que a ordem de inicialização de variável global é indefinida em várias unidades de compilação. Existem algumas soluções, mas mais informações sobre a sua aplicação, provavelmente, ser útil.

Primeiro teste para ver se principal é sequer entrou.

Eu acho que trabalhar com a cadeia vazia é o resultado de algum truque de otimização do compilador.

Outras dicas

Tente

valgrind --leak-check=full your.exe

e lembre-se de compilar seu aplicativo com -g para obter linha de código fonte no executável.

O problema não é a string. Em algum lugar em seu programa, você está lendo ou escrevendo fora dos limites. Isto resulta em um comportamento indefinido, o que significa que o poder programa aparecer para executar, você pode obter uma violação de acesso, ou pode falhar com outro erro, ou ... qualquer outra coisa poderia acontecer.

A razão a cadeia aparece para fazer a diferença é simplesmente que ele altera o programa sutilmente, fazendo com que o acesso fora dos limites para chegar a uma página não alocado.

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