この問題は、ローカル変数へのポインタを返すことによって発生します。関数GetParamFromLine
が戻ると、変数text
はスコープ外になります。返されたポインターは無効になり、未定義の動作が発生します。次のように、別の方法でデータを返す必要があります。
std::string txtval=GetParamFromLine("WINDOW_WIDTH");
val = atol(txtval.c_str());
std::string GetParamFromLine(char*parameter)
{
char text[16];
//
// do the reading procedure and fill the text
//
return std::string(text);
}
戻り値の型をポインターからローカルに変更するとstd::string
、ポインターをローカル変数に返す問題が軽減されます。によって使用されるリソースstd::string
は、オブジェクトによって管理され、自動的にクリーンアップされます。
atol
別の方法として、呼び出しを削除して、std::istringstream
代わりに a を使用することもできます。利点の 1 つは、これによりエラー報告が改善されることです。
std::string txtval=GetParamFromLine("WINDOW_WIDTH");
std::istringstream iss(txtval);
int val( 0 );
iss >> val;
本当に上を行きたい場合は、文字列の取得と整数データ型への変換の両方を組み合わせて、この新しい関数テンプレートの戻り値の型をパラメーター化できます。
template<typename T>
T GetValueFromLine(const std::string& param) {
std::string txtval=GetParamFromLine(param.c_str);
std::istringstream iss(txtval);
T val = T();
iss >> val;
return val;
}
このテンプレートを使用すると、次のことができます。
long wndWidth = GetValueFromLine<long>("WINDOW_WIDTH");
bool showInfo = GetValueFromLine<bool>("SHOW_INFO");
....
注: エラー処理は省略されています。