new operator
以下のコードでは、最初の行でオブジェクトの状態が既に変更されているため、この実装は例外セーフではないため、関数呼び出しによって例外が発生する可能性があることを著者は指摘しています。
String &String::operator =( const char *str ) {
// state is changed
delete [] s_;
if( !str ) str = "";
// exception might occur because of new operator
s_ = strcpy( new char[ strlen(str)+1 ], str );
return *this;
}
読んでいるときに、Cライブラリ関数はC++で例外をスローするのだろうかと思いましたか? C には例外がないことはわかっていますが、C++ コンパイラを使用しているため、例外がある可能性があります。
では、c 標準 lib 関数を例外安全な関数呼び出しと見なすことができますか?
ありがとうございました。
ところで、記録のために、上記の関数を実装する正しい方法 (例外セーフ) を以下に示します。
String &String::operator =( const char *str ) {
if( !str ) str = "";
char *tmp = strcpy( new char[ strlen(str)+1 ], str );
delete [] s_;
s_ = tmp;
return *this;
}