我是一个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;
}
所以我想总是弹出第二张卡片。 我确定这是一个初学者的错误:(
答案 0 :(得分:3)
您正在返回指向局部变量的指针
Card tmp = *ret;
Card *tmpp = &tmp;
m_Stack.remove(ret);
return tmpp;
退出函数后不再存在的。因此,当您稍后使用指针时,您将调用未定义的行为。
您不应该为tmp
和tmpp
而烦恼,返回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> >
),以便在不再使用内存时自动收集内存