在下面的程序中,一个字符串被添加到一个空存储中。然后这个存储元素的地址被存储在指针'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/