该问题是由返回指向局部变量的指针引起的。当函数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
呼叫并使用 astd::istringstream
代替。一个好处是这样可以更好地报告错误:
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");
....
注意:省略了错误处理。