c вектор пар указателей облажался

#c #pointers #vector #reference

#c #указатели #вектор #ссылка

Вопрос:

итак, у меня есть вектор пар указателей в c :

 vector<pair<Move *,Piece *> > moveList;
  

где Move — это объект, а Piece — это объект…
Фрагмент имеет переменные класса type и side

итак, я добавляю материал в список перемещений:

     pair <Move *, Piece *> pr (amp;m,amp;(p));


    moveList.push_back(pr);
  

где m — объект перемещения, а p — объект фрагмента

но всякий раз, когда я вызываю MoveList.back(), метод, по какой-то причине он изменяет значения Piece

так что я делаю

 Move * j = moveList.back().first;
  

Для элемента должно быть установлено значение переменной «type», равное ‘X’

но когда я выполняю отладку, оказывается, что сразу после строки выше, по какой-то причине, значение переменной Piece «type» устанавливается в какое-то сумасшедшее число, такое как -56 ‘ 310’…..

что я делаю не так?

Редактировать

также MoveList задается как переменная класса

и нажатие в MoveList и получение back () из MoveList были выполнены с использованием разных методов в этом классе

Комментарии:

1. Похоже, что m и p были созданы в стеке вместо с new , и теперь они вне области видимости.

2. Опубликуйте еще немного кода. Особенно объявление m и p.

Ответ №1:

Как указывали другие, похоже, у вас могут храниться указатели на объекты в стеке. Эти объекты выйдут из области видимости, как только вы выйдете из функции / блока. Поскольку контейнеры STL управляют своей памятью внутренне, одним из подходов может быть изменение вектора для хранения объектов напрямую, а не указателей.

 vector <pair <Move, Piece> > moveList;
// To insert
moveList.push_back (make_pair <Move, Pair> (move, pair));
  

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

Ответ №2:

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

 Move * move = new Move;
Piece * piece = new Piece;
moveList.push_back( make_pair(move, piece) );
  

Я не рассматривал безопасность исключений в этом примере для ясности и краткости.

Редактировать

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

 typedef pair< shared_ptr<Move>, shared_ptr<Piece> > MovePiece;
vector< MovePiece > moveList;
moveList.push_back( MovePiece(make_shared<Move>(), make_shared<Piece>()) );
  

Комментарии:

1. Это исправление, вероятно, приведет его прямо к утечке памяти.

2. @pmr Вероятно, верно, но на данный момент я не хочу забираться слишком высоко, не зная, в чем настоящая проблема.

3. @Peter Зачем ты пытался ответить на это, если ты не знаешь реальной проблемы? Я почти уверен, что то, что вы опубликовали, заставит его код скомпилироваться, но все равно будет далеко от идиоматического C . Пожалуйста, не поймите это неправильно.

4. @pmr добавил идиоматическое решение.

5. Я все еще хотел бы увидеть стандартный рэп о том, как вы должны предпочесть семантику значений указателям. 😉