将对象指针添加到向量后的值更改

Values changing after adding object pointer to vector

本文关键字:向量 对象 指针 添加      更新时间:2023-10-16

假设我有一个结构" a",那里有四个成员。这四个成员被命名:

  • 一个
  • 两个
  • 三个
  • 四个

我还有一个结构" B",那里有五个成员。五个成员中有四个来自结构A。然后,我有一个带有结构b的向量。我将每个创建的结构B添加到此向量。

这看起来像这样:

std :: vector <B *> vec;
for (A& a : input.buffer())
{
   B b =
   {
      a.one, a.two, a.three, a.four, random value
   };
   vec.push_back (& ​​b);
}
function_which_needs_a_const_pointer_to_the_first_element_and_size_of_vector      (vec.front (), vec.size ());

现在,我在代码中的不同点使用了许多std :: cout。我打印以下值:

a.one = 1304505
b.one (just before the push_back) = 1304505
vec [0] -> one (after the push_back) = 24050434

您可以看到,我对添加到向量后变化的值感到困扰,因此代码的其余部分无法再正确地运行。有人知道如何解决这个问题吗?我可能做一些愚蠢的事情。

我现在尝试了两天的Google,但似乎没有任何帮助。

感谢您的一些评论,我知道现在有悬空的指针。如果我将其作为共享指针而不是原始指针的向量,那么我将从共享指针到const Raw指针错误的转换无效。所以现在,我们知道这个问题。但是,修复它的最佳方法是什么?因为我不允许在该功能中触摸const Raw指针。

在大家按下"向下投票"按钮之前;你们仍然无法给我正确的解决方案。

问题的直接原因是,您的对象尝试使用它们时不存在。
您绝不应该存储使用&获取的指针以供以后使用。

问题的根本来源是您误解了练习。

您不允许修改的函数想要指向向量的第一个元素的指针,但是vec.front()不是指向向量的第一个元素的指针 - 它 is 是向量的第一个元素。
(此元素恰好是指针,但它不是指向向量开始的指针(。

您可以使用&vec[0]vec.data()&vec.front()的指针到vec的第一个元素。

这是您应该传递给该函数的内容,并且向量的类型应为vector<B>

就是

std::vector<B> vec;
for (A& a: input.buffer())
{
   B b ={ a.one, a.two, a.three, a.four, random value };
   vec.push_back(​b);
}
function_with_long_name(vec.data(), vec.size());

当您vec.push_back (& ​​b);时,您将指针推向即将停止存在的对象。当您vec[0]->one

时,没有B指向

您传递了局部变量的地址,该地址出现在范围时,该地址将无法使用,这就是为什么您的向量将在没有可用数据的情况下将指针包含到内存的原因。

请参阅代码中的注释。

std :: vector <B > vec; // just copy them all
for (A& a : input.buffer())
{
   B b =
   {
      a.one, a.two, a.three, a.four, random value
   };
   vec.push_back (​​b); //not passing by reference anymore, just copy.
}
function_which_needs_a_const_pointer_to_the_first_element_and_size_of_vector      (&vec.front (), vec.size ()); // Passing the reference of vec->front for the first element of the vector.