c++的指针对向量搞砸了

c++ vector of pairs of pointers screw up

本文关键字:向量 指针 c++      更新时间:2023-10-16

所以我有一个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;

每件作品都应该有自己的"类型"。变量的值设置为'X'

但是当我调试的时候,发现在上面那行之后,由于某种原因,Piece的"类型"变量的值被设置为一些疯狂的数字,例如-56 '310'.....

我做错了什么?

编辑

也将moveList设置为类变量

以及push到moveList和get back()到moveList是在这个类的不同方法上完成的

正如其他人指出的那样,似乎您可能持有指向堆栈上对象的指针。一旦退出函数/块,这些对象就会超出作用域。由于STL容器内部管理其内存,一种方法可能是将vector改为直接保存对象而不是指针。

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

当moveList对象超出作用域时,它将自动释放与该对象关联的内存。在指针的情况下,您必须记住手动释放内存,否则将会出现内存泄漏。

没有足够的代码来确定,但一个大胆的猜测是,您在堆栈上创建了对象,并且它们所在的堆栈帧不再存在。在这种情况下,一种修复方法是从堆中分配对象,如下所示:

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>()) );