c ++ вектор пар указателей облажался - PullRequest
1 голос
/ 25 апреля 2011

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

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

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

поэтому я добавляю материал в moveList:

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


    moveList.push_back(pr);

, где m - объект Move, а p - объект Piece

, но всякий раз, когда я вызываю метод moveList.back (), для некоторыхпричина, по которой он будет изменять значения Piece

, поэтому я должен

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

Piece должен иметь значение переменной "type", установленное в 'X'

, но когда я отлаживаюполучается, что сразу после строки выше, по какой-то причине, значение переменной типа "Piece" устанавливается на какое-то сумасшедшее число, такое как -56 '\ 310' .....

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

РЕДАКТИРОВАТЬ

Кроме того, MoveList устанавливается как переменная класса

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

Ответы [ 2 ]

5 голосов
/ 25 апреля 2011

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

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

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

2 голосов
/ 25 апреля 2011

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

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>()) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...