弹出第二个

时间:2012-10-22 18:53:52

标签: c++ list pointers iterator

我是一个C#程序员,有凌乱的指针问题,我只是无法找出错误是什么..我可以在列表中使用一些帮助

所以基本上我有一堆卡片,这些卡片保存在列表中。我只是想占据最高位置并将其返回给函数。我可以使用pop_back(),但最后一张卡必须保持不变,因为它是后背(我后来用纹理和东西制作它)

Card * CardStack::HandOut()
{
    if (m_Stack.size() > 1)
    {
        list<Card *>::iterator it = m_Stack.end();
        advance(it, -2);
        Card *ret = *it;
        Card tmp = *ret;
        Card *tmpp = &tmp;
        m_Stack.remove(ret);
        return tmpp;
    }
    return NULL;
}

所以我想总是弹出第二张卡片。 我确定这是一个初学者的错误:(

2 个答案:

答案 0 :(得分:3)

您正在返回指向局部变量的指针

Card tmp = *ret;
Card *tmpp = &tmp;
m_Stack.remove(ret);
return tmpp;
退出函数后不再存在的

。因此,当您稍后使用指针时,您将调用未定义的行为。

您不应该为tmptmpp而烦恼,返回ret应该这样做,remove不会破坏卡片,它只会移除(指针)它来自堆栈。

答案 1 :(得分:1)

您可以直接通过迭代器擦除项目指针。这也确保使用.remove()删除O(1)而不是O(n),并且如果内容不是唯一的,则避免删除额外的项目。

    std::list<Card*>::iterator it = m_Stack.end();
    std::advance(it, -2);
    Card* res = *it;
    m_Stack.erase(it);
    return res;

请注意,在C ++中存储原始指针并不是惯用的。如果复制很便宜,或者使用智能指针(例如list<Card>),最好按值存储对象(即使用list<shared_ptr<Card> >),以便在不再使用内存时自动收集内存