何か気がかりなことに気づきました。std::string
aをパラメーターとして受け入れるメソッドを作成するたびに、未定義の動作に自分自身を開放しました。
たとえば、これ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
...このように呼び出すことができます...
char* s = 0;
myMethod(s);
...そしてそれを防ぐために私ができることは何もありません(私は知っています)。
だから私の質問は次のとおりです。誰かがこれからどのように身を守るのでしょうか?
頭に浮かぶ唯一のアプローチは、次のstd::string
ように、パラメータとしてを受け入れるメソッドの2つのバージョンを常に記述することです。
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
これは一般的なおよび/または許容可能なソリューションですか?
編集: 私はパラメータとしてではconst std::string& s
なく受け入れるべきだと指摘する人もいstd::string s
ます。同意する。投稿を変更しました。しかし、それが答えを変えるとは思わない。
char* s = 0
が未定義であることは知りませんでした。私はそれを私の人生で少なくとも数百回見ました(通常はの形でchar* s = NULL
)。それをバックアップするための参照はありますか?
std:string::string(char*)
コンストラクターに向けて
const std::string&
そのパラメーターをとることができなかったと確信していますか?)
c_str
プロパティを確認できなかった理由はありますか?