gpt4 book ai didi

c++ - 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不是

转载 作者:行者123 更新时间:2023-12-01 15:05:25 26 4
gpt4 key购买 nike

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

}

我希望for循环的所有100次迭代的输出 strlen(mstr)完全相同。

在某些运行中,我得到了预期的输出。

223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
223
程序以退出代码结束: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
程序以退出代码结束:0

这怎么可能发生?

最佳答案

m.dump()返回一个临时的string_t对象。当到达整个;表达式末尾的const char* mstr = m.dump().c_str();时,该临时对象将超出范围。这意味着当您在对象上调用c_str()时,该对象仍然处于 Activity 状态,但是在将char*指针保存到mstr之后但可以将其打印到std::cout之前,该对象已被销毁。指针在该点处悬空,因此输出的行为是不确定的。

您需要保存临时对象,以便可以保持数据 Activity ,直到使用指向它的指针完成操作为止,例如:

for (int i = 0; i < 100; i++) {
string_t mstr = m.dump();
std::cout << strlen(mstr.c_str()) << std::endl;
}

然后可以简化一下,因为在这种情况下实际上根本不需要使用 strlen(),C++字符串知道其自身的长度:

for (int i = 0; i < 100; i++) {
string_t mstr = m.dump();
std::cout << mstr.size() << std::endl;
}

或者,您可以在临时对象仍在范围内时打印 size():

for (int i = 0; i < 100; i++) {
std::cout << m.dump().size() << std::endl;
}

关于c++ - 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58826774/

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