簡體   English   中英

如何訪問包含指向字符串的指針的向量的元素?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM