Chu*_* Xu 0 c++ std char stdstring
我需要动态创建一个 char[] 。我想使用 std::string 而不是直接处理 char[],因为我不需要使用 std::string 来处理内存管理。这是我的示例代码:
int main()
{
std::vector<char*> char_vec;
for(size_t i = 0; i < 10; i++)
{
std::string s;
s = "test" + std::to_string(i);
char_vec.push_back(const_cast<char*>(s.c_str()));
}
for(auto& ele : char_vec)
{
std::cout << ele << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
以我的理解,循环内部创建的字符串在每次迭代中都应该是全新的,但实际上,所有字符串都使用相同的地址来存储内容。为什么会出现这种情况?我应该如何修改我的代码以实现我的目标?
感谢您的所有帮助!
2023年1月10日更新:
我根据答案尝试了以下代码:
int main()
{
std::vector<char*> char_vec;
std::vector<std::string> str_vec;
for(size_t i = 0; i < 10; i++)
{
// str_vec.emplace_back("test" + std::to_string(i));
str_vec.push_back("test" + std::to_string(i));
char_vec.push_back(const_cast<char*>(str_vec.back().c_str()));
}
for(auto& ele : char_vec)
{
std::cout << ele << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
但仍然无法输出想要的结果。我可以问为什么这不起作用吗?
s.c_str()当指针仅存s在于循环迭代结束时,将指针存储在向量中将导致未定义的行为,最迟当您尝试读取这些指针时。
指针是否具有相同的值并不重要。一旦范围结束s,它们就变得无效。然后,编译器/库可以将它们寻址的内存重新用于任何用途。根本无法保证您能够从其中读到任何有意义的内容。你能test9回来就是“运气”。
您应该使用 astd::vector<std::string>然后char_vec.push_back(s);(或者如果您想优化char_vec.push_back(std::move(s)),但只是因为您不在s之后使用push_back)。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |