我试图将一个字符指针传递给函数,该函数将在内部使用字符串read_json。但是从函数中出来后,指针的内容就被更改了。下面是代码。
string tempstr;
void someFunc()
{
const char *ptr = getDiagnosticGroupValue("Device.ManagementServer");
printf("string : %s\n", getParameterValue(ptr, "URL"));
printf("string : %s\n", getParameterValue(ptr, "Username"));
}
const char* getParameterValue(const char *jsonstring, const char* param)
{
return getString(jsonstring, param);
}
const char* getString(const char *jsonstring, const char* param)
{
stringstream jsonstringstream;
jsonstringstream << jsonstring;
string paramstr(param);
try
{
boost::property_tree::ptree pt;
boost::property_tree::read_json(jsonstringstream, pt);
tempstr = pt.get<string>(paramstr);
return tempstr.c_str();
}
catch(...)
{
jsonstringstream.clear();
jsonstringstream.str("");
cout << "Node Doesn't exist" << endl;
return "N/A";
}
}
对于第一个节点(URL),它返回正确的值,并且我能够在someFunc()中打印字符串。但是ptr内容正在被修改(并且它不再是json格式的字符串)。因此,第二次调用getParameterValue()时,read_json引发异常,而不是json格式。我想知道为什么即使我声明为const char * ptr,ptr的内容也会改变。任何人都可以让我知道如何解决此问题。
我确认问题不在于临时对象。我通过创建全局字符串并从全局字符串返回char *来修改代码。但是我面临着同样的问题。还有一件事是,当第一次调用getParameterValue()时,我将print语句放在read_json()后面以检查ptr的值,并且那个时候ptr已经损坏了。
getDiagnosticGrouapValue()的实现如下。
const char* getDiagnosticGroupValue(const char* group)
{
VZUAL& vzual = VZUAL::getInstance();
string groupStr(group, group + strlen(group));
return vzual.Diagnostics.getGroupValue(groupStr).c_str();
}
const string PlatformDiagnostics::getGroupValue(const string& _groupName_, const string& DUMMY)
{
boost::property_tree::ptree ptRead;
boost::property_tree::ptree ptWrite;
string path = _groupName_ + ".";
stringstream ss;
try {
boost::property_tree::read_json(Resource::diagnosticsFile.c_str(), ptRead);
}
catch (boost::property_tree::json_parser::json_parser_error &je) {
return Resource::defaultValue;
}
try {
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, ptRead.get_child(path))
ptWrite.put(v.first.data(), v.second.data());
}
catch (...) {
return Resource::defaultValue;
}
boost::property_tree::write_json(ss, ptWrite);
return ss.str();
}
您将返回指向在getString函数内部在堆栈上创建的字符串的指针。这是未定义的行为。
从您的代码中,所有变量:
string paramstr(param);
boost::property_tree::ptree pt;
boost::property_tree::read_json(jsonstringstream, pt);
return (pt.get<string>(paramstr)).c_str();
表示此字符串不是静态创建的,也不是全局创建的。
如果您要返回指向jsonstring某个部分的指针,那么十个也许您应该在jsonstring中找到该字符串并返回指向它的指针。问题在于它不会以null终止(因此您还需要返回长度)。
另一种解决方案是为getString提供一个将从getString返回的char数组。但是,您必须确保它足够大,并且如果它太小则返回NULL,以便客户端代码可以提供更大的缓冲区。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句