c++的指针对向量搞砸了
c++ vector of pairs of pointers screw up
所以我有一个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>()) );
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 使用向量类的c++指针
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 如何更改唯一指针向量的可见性
- C++ 独特指针练习的向量
- C 中的向量指针的清晰图
- 当向量位于内部类中时,如何删除指向对象的向量指针
- std::向量指针
- 指向结构体的向量指针错误
- 删除指向指针的向量指针时出错
- 映射不同类型的向量指针
- 在c++中传递向量指针
- 虚拟类的向量:指针是干净的方法吗
- 如何从另一个向量/对象集构造新的向量/指针集
- 模型视图控制器- c++向量指针,太多的传递
- 为什么向量指针占用这么多内存?
- 删除条目向量指针的静态映射c++
- 复向量指针
- c++数组向量指针的初始化