c++ - 如何访问包含指向字符串的指针的 vector 的元素?

标签 c++ pointers vector

我正在学习 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/

相关文章:

c++ - 如何将 Vulkan-hpp 包含在 glfw 中?

c++ - 我怎样才能通过引用传递这个指针?

c++ - 在二维 vector 中搜索数字序列的更快方法是什么?

file - 将fread与std::vector一起使用时出错

c++ - 重载运算符 - () 作为自由函数而不是成员函数的意义?

c++ - 是否可以在一个对象中创建一个对象,该对象的构造函数是在 C++ 中从中创建它的对象

c++ - 如何修复仅在使用命名空间时发生的错误 C2664

c++ - 为什么取消引用指向 std::set 的提取节点的指针是未定义的行为?

c - 递增指针时的不明确行为

actionscript-3 - As3 Vector<T> 参数类型