我正在学习 vector ,并且遇到了一个难题,即使用指向字符串的指针创建项目 vector 的挑战
vector<string*> items;
我试图通过引用以下函数传递列表来添加项目:
void add_item(vector<string*> &items) {
string thing;
cout << "Add this item: ";
cin >> thing;
string* ptr = &thing;
items.push_back(ptr);
return;
}
然后使用以下命令显示所有项目:
void display(vector<string*> items) {
for (int i = 0; i <= items.size(); i++) {
cout << "> " << *items[i] << "\n";
}
return;
}
但这似乎不起作用,屏幕上没有输出,然后程序随机终止。我在这里做错了什么?
最佳答案
在add_item()
函数中,thing
是局部变量。您正在将其地址压入 vector 中,但是当函数返回时,thing
不再存在,因此存储在 vector 中的指针无效,并且稍后尝试对其进行取消引用将导致未定义的行为。
如评论中所述,您最可能想要的是string
对象的 vector ,而不是string
指针。
但是,如果您确实需要使用vector<string*>
(尽管我认为没有必要,并且我不建议这样做),则应该在add_item()
函数中创建一个新字符串(当然,然后对其进行delete
编码)当您稍后将其从 vector 中删除时):
void add_item(vector<string*> &items) {
string *thing = new string;
cout << "Add this item: ";
cin >> *thing;
items.push_back(thing);
return;
}
vector<string*> items;
add_item(items);
...
for (size_t i = 0; i < items.size(); ++i) {
delete items[i];
}
在这种情况下,
thing
在堆上创建,并且在函数返回后仍然有效。
关于c++ - 如何访问包含指向字符串的指针的 vector 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60731306/