Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将对象指针添加到向量后更改的值_C++_Pointers_Vector_Struct - Fatal编程技术网

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

C++ 将对象指针添加到向量后更改的值,c++,pointers,vector,struct,C++,Pointers,Vector,Struct,假设我有一个有四个成员的结构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.

假设我有一个有四个成员的结构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 ());
正如你所看到的,我为价值观所困扰​​添加到向量后的更改,其结果是代码的其余部分无法再正常工作。 有人知道我怎么解决这个问题吗?我可能做了些傻事

我现在尝试谷歌两天,但似乎没有任何帮助

多亏了你的一些评论,我现在知道有悬而未决的指针。如果我使它成为共享指针的向量而不是原始指针,那么从共享指针到常量原始指针的转换将无效。 现在,我们知道了问题所在。但解决这个问题的最佳方法是什么?因为我不允许在该函数中触摸const raw指针


在你们全部按下向下投票按钮之前;你们中没有人能给我正确的解决方案。

当你们后退时&​​B您正在将指针推送到即将不存在的对象。当你传递一个局部变量的地址,而这个地址在超出范围时变得不可用,这就是为什么你的向量会包含指向内存的指针而没有可用数据的原因。

问题的直接原因是当你试图使用它们时,你的对象不存在。 永远不要存储用&获取的指针,以备将来使用

问题更根本的根源是你误解了练习

不允许修改的函数需要指向向量的第一个元素的指针,但vec.front不是指向向量的第一个元素的指针-它是向量的第一个元素。 这个元素恰好是一个指针,但它不是指向向量开头的指针

您可以使用&vec[0]或vec.data或&vec.front获取指向vec的第一个元素的指针

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

就是

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());
请参阅代码中的注释

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.

向量包含循环后的悬空指针。请提供一个。对于每个结构,容器中的A不是有效代码。我们在代码中找不到你没有展示给我们的错误如果你像这样填充一个向量,这是一个非常清楚的指示,你的向量应该包含对象而不是指针。看起来你在创建一个B中的a的副本,这是一个局部变量。当您退出代码时,变量B超出范围,因此其内容不再有效。是什么原因导致所有这些任意限制妨碍了正确的学习?斯密汉克斯,现在我来解决这个问题。现在需要找到一个解决方案呵呵。那么什么才是合适的解决方案呢?我的错,对不起。我指的是第一个要素。我不能复制数据,否则我将不得不复制数千次。@Gigitex为什么你认为你需要复制任何东西?你说的是vector而不是vector,这不意味着我将把结构复制到该向量中,而不是仅仅传递指针吗?@Gigitex是的,但你无论如何都需要创建那么多对象。如果确实存在性能问题,可以使用emplace_back而不是push_back,但除非复制B非常昂贵,否则不会有问题。数千在现代计算机上几乎算不上什么。你可以删除唯一的\u ptr-它不会影响任何生命周期,也不能解决问题。不在向量中存储指针并实际将指针传递到第一个元素是解决问题的方法。似乎也能很好地工作@molbdnilo我将编辑它,谢谢。
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.