あなたのクラスには、 という名前のポインタであるメンバーがありますstored
。のインスタンスClass
がコピーされる場合:
Class foo( "str" );
Class bar( foo ); // Copy
デフォルトのコピーコンストラクターを使用すると、クラスのメンバーがコピーされます。その場合、stored
そのコンテンツではなく、ポインターである人がコピーされます。
そのため、ここでコピー コンストラクターとoperator=
or コピー代入演算子を次のように再定義する必要があります。
Class::Class( const Class& another )
{
stored = new char[strlen(another.stored) + 1];
strcpy( stored, another.stored );
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Copy the buffer
}
void Class::operator = ( const Class& another )
{
char* temp = new char[strlen(another.stored) + 1];
strcpy( temp, another.stored);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Copy the buffer
delete[] stored;
stored = temp;
}
そうしないと、最初のインスタンス (たとえばa
) が破棄されたときに、 のメンバーにアクセスしようとすると、未定義の動作が発生します。stored
b