gpt4 book ai didi

c++ - 从字符串 stringstream 中获取 const ptr 时的行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:22 24 4
gpt4 key购买 nike

我有以下代码,我试图理解它的行为:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

void fill(std::vector<const char *> & vec, string str) {
uint32_t start_count = 1;
stringstream regname;
for(uint32_t count = 0; count <= 3; count++) {
regname.str("");
regname << str << (uint32_t)(count + start_count);
std::cout << "regname : " << regname.str() << std::endl;
vec.push_back(regname.str().c_str());
}
}

int main() {
vector<const char *> vec;
fill(vec, "temp");

for(int i = 0; i < vec.size(); i++)
std::cout << "value at index : " << i << " is : " << vec[i] << std::endl;
return 0;
}

vector 中的初始字符串被正确打印,但是对于在 fill 方法中初始化的字符串,我得到所有带有“temp4”的实例,这是最后一个初始化的字符串。使用 const char * 的 std::vector 时的 O/P:

regname : temp1
regname : temp2
regname : temp3
regname : temp4
value at index : 0 is : temp4
value at index : 1 is : temp4
value at index : 2 is : temp4
value at index : 3 is : temp4

当我尝试改用 std::vector 时,此行为已得到纠正。使用字符串对象的 std::vector 时的 O/P :

regname : temp1
regname : temp2
regname : temp3
regname : temp4
value at index : 0 is : temp1
value at index : 1 is : temp2
value at index : 2 is : temp3
value at index : 3 is : temp4

只是想知道是什么导致了这种行为?

最佳答案

在 regname 上调用 str 将返回流内容的字符串拷贝。对该字符串调用 c_str 将返回一个指向数组的指针,该数组包含该字符串中的字符序列。

显然,您推回此数组的指针对于所有 4 次循环迭代都是相同的,并且在调用 fill 方法后打印它们将打印相同的内容四次。

您当前的代码是不安全的,因为字符串在您的 fill 方法中是临时的,并且指向其内部字符数组的指针在从 fill 返回后会悬空。最好在 vec vector 中使用字符串来存储真实拷贝。

关于c++ - 从字符串 stringstream 中获取 const ptr 时的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31242443/

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