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

时间:2011-04-24 22:30:01

标签: c++ pointers vector reference

所以我在c ++中有一对指针对象:

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

其中Move是一个对象而Piece是一个对象...... Piece具有类变量类型和侧面

所以我把东西添加到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并获取moveList的back()是在该类中的不同方法上完成的

2 个答案:

答案 0 :(得分:5)

正如其他人所指出的,似乎你可能正在持有指向堆栈上对象的指针。退出功能/块后,这些对象将超出范围。由于STL容器在内部管理它们的内存,一种方法可能是更改向量以直接保存对象而不是指针。

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

当moveList对象超出范围时,它将自动释放与对象关联的内存。在指针的情况下,你必须记住手动释放内存,否则会有内存泄漏。

答案 1 :(得分: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>()) );