首页 > 解决方案 > 在 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

这怎么可能发生?

标签: c++jsonstringpointersnlohmann-json

解决方案


转储函数将一个对象返回到堆栈。通过使用来自该对象的指针,您可能偶尔会发现对象内存在您打印值之前被重用。应该做的是直接存储转储的字符串:

std::string mstr = m.dump();
std::cout << mstr.size() << std::endl;

推荐阅读