[英]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.