gpt4 book ai didi

c++ - Json cpp asCstring() 存储在变量中时返回空 cstring

转载 作者:行者123 更新时间:2023-11-30 04:26:46 26 4
gpt4 key购买 nike

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

最佳答案

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

1 的情况下,strasString()< 返回的 std::string 的拷贝.

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

要解决,要么:

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

编辑:

基于此source , Value.get() 的所有变体都返回一个 Value。所以原因如前所述。

关于c++ - Json cpp asCstring() 存储在变量中时返回空 cstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11342627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com