次のものがあるとします。
class StringClass
{
public:
...
void someProcessing( );
...
StringClass& operator=(const StringClass& rtSide);
...
private:
char *a;//Dynamic array for characters in the string
int capacity;//size of dynamic array a
int length;//Number of characters in a
};
StringClass& StringClass::operator=(const StringClass& rtSide)
{
capacity = rtSide.capacity;
length = rtSide.length;
delete [] a;
a = new char[capacity];
for (int i = 0; i < length; i++)
a[i] = rtSide.a[i];
return *this;
}
私の質問は、次のようにオブジェクトをそれ自体に割り当てようとすると、なぜこの代入演算子のオーバーロードの実装が問題を引き起こすのかということです。
StringClass s;
s = s;
私が読んでいる教科書(Absolute C ++)には、delete [] a;
「ポインタsaは未定義です。代入演算子によってオブジェクトが破損し、このプログラムの実行がおそらく台無しになっている」と書かれています。
なぜオペレーターがsを破損したのですか?削除した直後にsaを再初期化する場合、なぜこれがプログラムでこのような問題を引き起こし、関数を次のように再定義する必要があるのでしょうか。
StringClass& StringClass::operator=(const StringClass& rtSide)
{
if (this == &rtSide)
//if the right side is the same as the left side
{
return *this;
}
else
{
capacity = rtSide.capacity;
length = rtSide.length;
delete [] a;
a = new char[capacity];
for (int i = 0; i < length; i++)
a[i] = rtSide.a[i];
return *this;
}
}