1

我是一名 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;
}

所以我想总是弹出倒数第二张卡片。我敢肯定它完全是初学者的错误:(

4

2 回答 2

3

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

Card tmp = *ret;
Card *tmpp = &tmp;
m_Stack.remove(ret);
return tmpp;

函数退出后不再存在。因此,当您稍后使用指针时,您会调用未定义的行为。

你不应该打扰tmpand tmpp,返回ret应该这样做,remove不会破坏卡片,它只是从堆栈中删除(指向)它的指针。

于 2012-10-22T18:56:37.867 回答
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++ 中存储原始指针并不是惯用的。如果复制成本较低,最好按值存储对象(即 use list<Card>),或者使用智能指针(例如list<shared_ptr<Card> >),以便在不再使用内存时自动收集内存。

于 2012-10-22T19:01:17.177 回答