c++ - 在 for 循环的某些迭代中,字符串的长度为 0,而在其他迭代中则为 0
问题描述
我正在为 C++ 使用nlohmann::json库。我有以下代码。
#include <iostream>
#include <json.hpp>
using json = nlohmann::json;
int main(){
json m;
m["aaaaaaaa"] = 0;
m["bbbbbbbbbbbbb"] = 0;
m["ccccccccccccccccccc"] = 0;
m["dddddddddddddddddd"] = 0;
m["eeeeeeeeeeeeeeeeee"] = 0;
m["fffffffffffff"] = 0;
m["gggggggggggg"] = 0;
m["hhhhhhhhhhhh"] = 0;
m["iiii"] = 0;
m["jjjjjjjjjjjjjjj"] = 0;
m["kkkkkkkkkkkkkk"] = 0;
m["llllllllllllllll"] = 0;
for (int i = 0; i < 100; i++) {
const char* mstr = m.dump().c_str();
std::cout << strlen(mstr) << std::endl;
}
}
我希望strlen(mstr)
for 循环的所有 100 次迭代的输出完全相同。
在某些运行中,我得到了预期的输出。
223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 253 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 253程序以退出代码结束:0
但在其他运行中,我偶尔会看到字符串的长度为 0。
223 0 223 223 223 223 223 223 223 223 223 0 223 223 223 223 223 0 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 0 223 223 223 223 223 223 223 223 0 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 253程序以退出代码结束:0
这怎么可能发生?
解决方案
转储函数将一个对象返回到堆栈。通过使用来自该对象的指针,您可能偶尔会发现对象内存在您打印值之前被重用。应该做的是直接存储转储的字符串:
std::string mstr = m.dump();
std::cout << mstr.size() << std::endl;
推荐阅读
- ios - 表单/表格中的 SwiftUI 多个 NavigationLink - 条目保持突出显示
- python - 如何使用 PostgreSQL 和 %sql 魔术在 Jupiter 中选择带有空格的列名?
- java - 如何更改椭圆的行和列的颜色以响应鼠标悬停在其中一个椭圆上?
- php - android live设备上的离子和电容器的CORS问题
- swift - 我想将字符串值从 API 转换为自定义可编码模型 SWIFT
- mysql - 减去来自不一定相同的两个不同选择的记录的一列的值
- php - 将值存储更长时间 - (如何在 cookie 中存储布尔值)
- javascript - 如果我尝试在 axios 中设置状态捕获 React 中的错误,我会得到无限量的 GET 404 错误
- gunicorn - gUnicorn 与 systemd 看门狗
- javascript - React Native,子文件夹中文件的子文件夹路径