Operador () como um subscrito (C ++)
-
23-09-2019 - |
Pergunta
Eu uso o operador () como operador de subscrito desta maneira:
double CVector::operator() (int i) const
{
if (i >= 0 && i < this->size)
return this->data[i];
else
return 0;
}
double& CVector::operator() (int i)
{
return (this->data[i]);
}
Funciona quando recebo valores, mas recebo um erro quando tento escrever atribuir um valor usando
a(i) = 1;
Up: texto de erro:
Exceção não atendida em 0x651cf54a (msvcr100d.dll) em cg.exe: 0xc0000005: Localização de leitura de violação de acesso à violação 0xcccccc0.
Solução
Como eu disse no meu comentário, o problema é o seu design defeituoso. Eu faço uma garantia de 100% em uma de duas coisas:
- O valor que você está passando para a função de atribuição está fora do intervalo válido.
- O membro
data
está apontando para o espaço inválido na memória.
Em ambos os casos, sugiro adicionar:
#include <cassert>
e adicionando assert(i >= 0 && i < this->size)
Em vez das falhas silenciosas:
double CVector::operator() (int i) const
{
assert(i >= 0 && i < this->size);
return this->data[i];
}
double& CVector::operator() (int i)
{
assert(i >= 0 && i < this->size);
return (this->data[i]);
}
Outras dicas
Isso porque você não implementou o tratamento de erros em double& CVector::operator() (int i)
Como você fez para a outra função que sobrecarrega ()
.
Mude para:
double& CVector::operator() (int i)
{
if (i >= 0 && i < this->size)
{
return this->data[i];
}
else // Whatever manner you want to gracefully exit the program
{
std::cout<<"Out of bounds!"<<endl;
exit(1);
}
}
Você também deve considerar alterar o mecanismo de manuseio de erros na outra função de return 0;
a algo mais significativo.
Isso pode ser um fio fechado, mas queria compartilhar o motivo do mesmo erro no meu ambiente.
Também tivemos o mesmo problema - vários servidores (alguns deles recentemente unidos para a fazenda). Apenas fluxos de trabalho usados para falhar com o erro "A mensagem de e-mailnão pode ser enviado. Certifique-se de que as configurações de e-mail de saída do servidor estejam configuradas corretamente ".
A razão foi que os 2 novos servidores não foram adicionados à lista de servidores do servidor do servidor SMTP " (eu não sou um especialista em troca, mas sua equipe do Exchange Enterprisevai entender isso).
Uma vez que adicionamos os 2 novos servidores à lista de servidores de relé, o erro se foi e tudo começou a funcionar bem.!
O problema é que você não verifica o índice fora do alcance em seu double&
versão de operator()
.
Você provavelmente não pode garantir isso data[i]
aponta para um endereço de memória válido para um grande o suficiente i
. Você deve verificar se há índice fora do alcance e lançar alguma exceção ou redimensionar seu vetor (alocando mais memória data
) ser capaz de manter mais valores.