c++ - 字符串和商店

标签 c++ pointers set element stdvector

在下面的程序中,一个字符串被添加到一个空存储中。然后这个存储元素的地址被存储在指针's1'中。然后添加另一个字符串,这会以某种方式导致指向原始元素的指针失败。

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

class store2
{
    public:
        void add(std::string s) {words.push_back(s); last_added2 = &words.at(words.size() - 1);}
        std::string* last_added() {return last_added2;}

    private:
        std::string* last_added2;
        std::vector<std::string> words;
};

void main()
{
    store2 store;
    store.add("one");
    std::string* s1 = store.last_added();
    std::cout<<*s1<<std::endl;
    store.add("two");
    std::cout<<*s1<<std::endl; // crash
}

最佳答案

当您将新项目添加到 std::vector 时, vector 可能需要扩展其缓冲区,并且通过这样做,它可能会将缓冲区移动到不同的内存区域中。因此,指向其元素的指针变得无效。简而言之,在调整 vector 大小后,不保证指向 vector 项的指针有效,并且如果 vector 没有足够的保留空间,则 push_back 可能会调整 vector 的大小。

您可以在开始时为 vector 预留空间,但随后您可以分配到 vector 中的项目数量就会受到限制。

关于c++ - 字符串和商店,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818400/

相关文章:

新套接字上的 C++ CreateIoCompletionPort

C# 指针引用

python - 在 python 中,如何将两个具有关联计数列表的非常大的列表合并为一个具有关联计数列表的列表?

mysql - SQL高级过滤

c++ - 根据概率生成 "characters"

c++ - 隐式转换应该在模板参数的上下文中工作吗?

c++ - C++ 中的 constexpr 指针和内存管理

c++ - 删除带有数据指针的节点?

c# - 如何使用 linq lambda 语法查找具有精确长度的子集

c++ - 带有 libcurl v7.43.0 的 Axis Camera 上的 RTSP DESCRIBE 返回 RTSP 错误代码 400