【问题标题】:c++ vector of pairs of pointers screw upc++ 指针对向量搞砸了
【发布时间】:2011-04-24 22:30:01
【问题描述】:

所以我在 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 的推入和 moveList 的返回()操作

【问题讨论】:

  • mp 之类的声音是在堆栈上创建的,而不是 new,现在它们超出了范围。
  • 发布更多代码。尤其是 m 和 p 的声明。

标签: c++ pointers vector reference


【解决方案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>()) );
    

    【讨论】:

    • 这个修复可能会直接导致他出现内存泄漏。
    • @pmr 可能是真的,但目前我不想爬太高而不知道真正的问题是什么。
    • @Peter 如果您不知道真正的问题,为什么要尝试回答这个问题?我很确定您发布的内容将使他的代码编译,但仍与惯用的 C++ 相去甚远。请不要走错路。
    • @pmr 添加了一个惯用的解决方案。
    • 我仍然希望看到关于您应该如何更喜欢值语义而不是指针的标准说唱。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2014-04-12
    相关资源
    最近更新 更多