#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. Я все еще хотел бы увидеть стандартный рэп о том, как вы должны предпочесть семантику значений указателям. 😉