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.

Foi útil?

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:

  1. O valor que você está passando para a função de atribuição está fora do intervalo válido.
  2. 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.

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