Json cpp asCstring() 存储在变量中时返回空字符串
Json cpp asCstring() returns empty cstring when stored in variable
我正在使用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
的情况下,str
是asString()
返回的std::string
的副本。
在3
的情况下,临时Value
将一直存在到表达式(;
)结束,允许asCString()
返回的const char*
被成功处理。
要解决以下任一问题:
- 将
cstr
类型更改为std::string
,它将复制返回的const char*
,或 - 制作
get()
返回的Value
的副本并查询它而不是root[]
。
编辑:
基于此源,Value.get()
的所有变体都返回一个Value
。所以原因如前所述。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从COM模块中的函数返回字符串数组?
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 我如何在函数 cpp 中返回字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 格式化返回字符串C++
- 返回字符串vs通过引用传递字符串以更新值
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 从 C++ 中的模板函数返回字符串和整数
- 返回字符串的散点回文计数
- C++重载字符串 [] 运算符以返回字符串和
- 返回字符串和不同向量数据类型的映射C++
- 字符串函数不返回字符串? C++
- 从函数返回字符串C++错误
- 如何在返回字符串的函数中不忽略void值
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- C - 返回字符串时的分割故障
- 使用向量和字符串函数返回字符串