为什么 std::string 在循环内的同一地址存储内容?

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)

但仍然无法输出想要的结果。我可以问为什么这不起作用吗?

use*_*522 6

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)。