AccessViolationException quando cadeia é muito longa (C ++)
-
11-09-2019 - |
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
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.