Opérateur () en indice (C ++)
-
23-09-2019 - |
Question
J'utilise l'opérateur () comme opérateur de cette façon indice:
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]);
}
Il fonctionne quand je reçois des valeurs, mais je reçois une erreur lorsque je tente d'écrire attribuer une valeur à l'aide
a(i) = 1;
UPD: Texte d'erreur:
exception non gérée à 0x651cf54a (Msvcr100d.dll) dans CG.exe: 0xC0000005: Accès emplacement de lecture de violation 0xccccccc0.
La solution
Comme je l'ai dit dans mon commentaire, le problème est votre conception défectueuse. Je fais une garantie de 100% sur l'une des deux choses:
- La valeur que vous passez à la fonction d'affectation est hors de portée valide.
- Le
data
membre est orientée vers l'espace en mémoire invalide.
Dans les deux cas, je vous suggère d'ajouter:
#include <cassert>
et en ajoutant assert(i >= 0 && i < this->size)
au lieu des échecs silencieux:
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]);
}
Autres conseils
C'est parce que vous n'avez pas le traitement des erreurs mises en œuvre dans double& CVector::operator() (int i)
comme vous l'avez fait pour l'autre fonction qui surchargent ()
.
Changer à:
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);
}
}
Vous devriez également envisager de modifier le mécanisme de gestion des erreurs dans l'autre fonction de return 0;
à quelque chose de plus significatif.
exception non gérée à 0x651cf54a (Msvcr100d.dll) dans CG.exe: 0xC0000005: Accès emplacement de lecture de violation 0xccccccc0.
0xcc
est la valeur de l'octet de la mémoire non initialisée MSVC. En d'autres termes, votre problème est probablement dû à l'accès à un pointeur non initialisé ou un pointeur qui a été dérivé de la mémoire non initialisée.
Le problème est que vous ne cochez pas pour l'indice hors de portée dans votre version de double&
operator()
.
Vous ne pouvez probablement pas garantir que les points de data[i]
à une adresse mémoire valide pour une assez grande i
. Vous devriez vérifier soit index hors de portée et de jeter une exception ou redimensionner votre vecteur (en allouant plus de mémoire ne data
) pour pouvoir tenir plus de valeurs.