Изменение значений после добавления указателя объекта на вектор - PullRequest
0 голосов
/ 09 мая 2019

Допустим, у меня есть структура "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, но, похоже, ничего не помогло.

Благодаря некоторым вашим комментариям теперь я знаю, что есть свисающие указатели.Если я сделаю его вектором общих указателей вместо необработанных указателей, я получу недопустимое преобразование из общего указателя в ошибку константного необработанного указателя.Итак, теперь мы знаем проблему.Но как лучше это исправить?Потому что мне не разрешено касаться этого константного необработанного указателя в этой функции.

Прежде чем вы все нажмете кнопку голосования вниз;Никто из вас все еще не может дать мне правильное решение.

Ответы [ 4 ]

1 голос
/ 09 мая 2019

Непосредственной причиной проблемы является то, что ваши объекты не существуют, когда вы пытаетесь их использовать.
Вы никогда не должны хранить указатель, который вы приобрели с помощью & для дальнейшего использования.

Более фундаментальным источником проблемы является то, что вы неправильно поняли упражнение.

Функция, которую нельзя изменять, требует указателя на первый элемент вектора, но 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());
0 голосов
/ 09 мая 2019

См. Комментарии в коде.

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.
0 голосов
/ 09 мая 2019

Вы передаете адрес локальной переменной, который становится недоступным при выходе из области видимости, поэтому ваш вектор будет содержать указатели на память без доступных данных.

0 голосов
/ 09 мая 2019

Когда вы vec.push_back (& ​​b);, вы нажимаете указатель на объект, который собирается прекратить свое существование.Нет B, на который можно указать, когда вы vec[0]->one

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...