假设我有一个结构“ 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原始指针错误的转换无效。 所以现在,我们知道了这个问题。但是修复它的最佳方法是什么?因为不允许我在该函数中触摸该const原始指针。
在全部按下向下投票按钮之前;你们中没有人仍然能够给我正确的解决方案。
答案 0 :(得分:1)
问题的直接原因是,当您尝试使用它们时,它们不存在。
您永远不应存储通过&
获取的指针供以后使用。
该问题的更根本原因是您对练习有误解。
您不允许修改的函数需要一个指向向量的第一个元素的指针,但是vec.front()
不是指向向量的第一个元素的指针-它是向量的第一个元素。
(此元素恰好是一个指针,但不是指向向量开头的指针。)
您可以使用vec
或&vec[0]
或vec.data()
获得指向&vec.front()
的第一个元素的指针。
这是您应该传递给函数的内容,向量的类型应为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());
答案 1 :(得分:0)
vec.push_back (& b);
时,您正在将指针推向将不再存在的对象。当您B
vec[0]->one
指向
答案 2 :(得分:0)
您传递的本地变量地址超出范围时将不可用,这就是为什么您的向量将包含指向内存的指针而没有可用数据的原因。
答案 3 :(得分:-1)
查看代码中的注释。
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.