オペレーター()として、下付き文字(C++)
-
23-09-2019 - |
質問
私は利用者として、下付き文字オペレーターこの方法:
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]);
}
この作品のような価値、または、エラーの時に書いてみように割り当てる値
a(i) = 1;
UPD:エラーテキスト:
独自のレンダリングメカニズムの例外を0x651cf54a (msvcr100d.dll)CG.exe:0xC0000005:アクセス違反の読書の場所 0xccccccc0.
解決
のように言ったの私のコメントの問題は欠陥のあるデザイン。この100%保証のは二つのことをやろうとしてい
- の値ですぐに配置機能が有効です。
- 会員の
data
はつ無効なスペース。
いずれの場合も、私はあなたが追加:
#include <cassert>
加 assert(i >= 0 && i < this->size)
の代わりにサイレント障害:
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]);
}
他のヒント
double& CVector::operator() (int i)
をオーバーロード、他の機能のために行ったようにあなたが()
でエラー処理を実装していないためです。 だこと
に変更し、それをます:
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);
}
}
また、より意味のあるものにreturn 0;
から他の機能にメカニズムをエラー処理を変更することを検討する必要があります。
0x651cf54aで未処理の例外 CG.exe中(msvcr100d.dll):0xc0000005で: アクセス違反読み取り場所 0xccccccc0ます。
0xcc
はMSVC初期化されていないメモリのバイト値です。言い換えれば、あなたの問題は、初期化されていないメモリから派生した初期化されていないポインタまたはポインタへのアクセスに最も可能性があります。
問題は、あなたがdouble&
のごoperator()
バージョンで範囲外のインデックスをチェックしないことです。
あなたはおそらく十分な大きdata[i]
のための有効なメモリアドレスにそのi
ポイントを保証することはできません。あなたは、どちらかのより多くの値を保持できるようにする(data
を行い、より多くのメモリを割り当てることによって)、範囲外のインデックスをチェックして、いくつかの例外をスローしたり、ベクトルのサイズを変更する必要があります。