将对象指针添加到向量后的值更改
Values changing after adding object pointer to vector
假设我有一个结构" 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.
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 迭代时从向量和内存中删除对象
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 如何创建从同一类继承的不同对象的向量
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 从多个源构造一个对象,包括一个对象向量
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 将向量对象存储在共享指针投掷错误中
- E0312,C2664尝试将向量对象作为函数参数传递时错误
- 相对于向量对象的两个成员,找到两个向量的相交的有效方法
- 将数据从文件读取到向量对象
- C 向量对象访问
- 向量对象声明后的括号是什么意思
- 2向量对象指向相同的分配内存
- 如何返回向量对象
- 传递单个或向量对象时没有重载函数的实例
- 指向数组和向量对象的指针
- 向量对象库,可以存储其他对象类型的对象
- 如何从另一个向量/对象集构造新的向量/指针集