1

我正在使用 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 } }
4

1 回答 1

2

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

在 的情况下1strstd::string返回的副本asString()

在 的情况下3,临时变量Value将一直存在到表达式 (the ;) 结束,从而允许成功处理const char*返回的 by 。asCString()

要解决,要么:

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

编辑:

基于此来源,所有变体都Value.get()返回 a Value。所以原因如前所述。

于 2012-07-05T10:49:02.110 回答