当存储在变量中时,Json cpp asCstring()返回空cstring

时间:2012-07-05 10:39:01

标签: c++ json jsoncpp

我正在使用Json-cpp来解析我的配置文件,我用asCString()获得了一些奇怪的行为..任何人都能解释为什么2的输出是空的吗?

#include <iostream>
#include <fstream>
#define JSON_IS_AMALGAMATION
#include "json/json.h"
using std::cout;
using std::endl;

int main(int argc, char** argv) {
    Json::Value root;
    Json::Reader reader;
    std::ifstream config("dev.json", std::ifstream::binary);
    if (!reader.parse(config, root, false)) {
      cout << "Could not parse json" << endl;
      return 1;
    }
    std::string str = root["redis"].get("host", "localhost").asString();
    const char* cstr = root["redis"].get("host", "localhost").asCString();
    cout << "1:" << str << endl;
    cout << "2:" << cstr << endl;
    cout << "3:" << std::string(root["redis"].get("host", "localhost").asCString()) << endl;
    config.close();
    return 0;
}

输出:

c++ -o test test.cpp jsoncpp.cpp
1:127.0.0.2
2:
3:127.0.0.2

我的json数据:

{ "redis": { "host": "127.0.0.2", "port": 6379 } }

1 个答案:

答案 0 :(得分:2)

我怀疑root["redis"].get("host", "localhost")root["redis"]会返回Value,而不是Value的引用。 Value对象将一直存在直到表达式结束,在2的情况下,临时Value对象将被销毁,将cstr作为悬空指针。取消引用悬空指针时,行为未定义。

如果是1,则strstd::string返回的asString()的副本。

对于3,临时Value将一直存在,直到表达式结束(;),允许const char*返回asCString()成功处理。

要解决,要么:

  • cstr的类型更改为std::string,并将复制返回的const char*
  • 制作Value返回的get()的副本,然后查询而不是root[]

编辑:

根据此sourceValue.get()的所有变体都会返回Value。所以原因如上所述。