繁体   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