[英]How to acces elements of a vector which contains pointers to strings?
我正在学习向量,并遇到了一个问题,即使用指向字符串的指针创建项目向量的挑战
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
是一个局部变量。 您将其地址推送到向量中,但是当函数返回时, thing
不再存在,因此存储在向量中的指针无效,稍后尝试取消引用它会导致未定义的行为。
正如评论中提到的,您最可能想要的是string
对象的向量,而不是string
指针。
但是,如果您确实需要使用vector<string*>
(尽管我认为没有必要,而且我不建议这样做),那么您应该在add_item()
函数中创建一个新字符串(并且,当然,然后在您稍后将其从向量中delete
时将其删除):
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
是在堆上创建的,并且在函数返回后将保持有效。
您正在将指向字符串thing
的指针添加到指向字符串的指针向量中。 但是一旦add_item
返回, thing
就会超出范围。 所以你添加的指针现在是一个指向空的指针。
为什么需要指针向量? 这几乎从来都不是对的。
如何访问包含指向字符串的指针的向量的元素?
像这样:
*items[i]
但是,向量中的指针必须指向有效对象,否则通过指针访问对象的行为是未定义的。
在您的示例中,字符串是add_item
的自动变量。 当函数返回时,包括字符串在内的所有自动变量都会被自动销毁。 此时向量中的指针已经失效。 通过指针间接访问对象的行为是未定义的。
我在这里做错了什么?
您尝试通过无效指针进行访问并且程序的行为未定义。
这是使用指针向量的正确示例:
{
std::string thing = "example";
items.push_back(&thing);
display(items);
items.pop_back(); // erase the pointer that is about to be invalidated
}
// the string no longer exists here
请注意字符串在显示时如何仍然存在。
但是,您可能应该改用std::vector<std::string>
以避免此类问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.