[英]std::list iterator.erase() is causing an invalid pointer
嗨,我在std::list
上遇到了問題,在我調用free()
函數時,我得到了一個free()
:無效的指針錯誤,然后迭代到該元素。 我希望它會因為刪除而跳過該元素...我的第一個假設是您可能需要一個新的迭代器,因為前一個是過時的。 所以我的解決方案是將迭代器設置為list.begin()
,然后將其前進。 但是,這仍然會導致錯誤。
我想做的是將列表中的元素設置為前面n個空格的元素。 然后刪除前面n個空格的元素。
#include "roulette.h"
#include <iostream>
uint roulette(uint people, uint step)
{
std::list<uint>::iterator iterator;
uint position = 0;
for(uint i = people; i > 0; i--)
gl_myList.push_front(i);
iterator = gl_myList.begin();
while(people > 1)
{
for(uint i = 0; i < step - 1; i++)
{
position++;
iterator++;
if(iterator == gl_myList.end())
{
iterator = gl_myList.begin();
position = 0;
}
}
*iterator = kill(iterator, step);
/*
* This was my attempt to fix it
iterator = gl_myList.begin();
advance(iterator, position);
*/
people--;
}
return *iterator;
}
#include "roulette.h"
#include <iostream>
uint kill(std::list<uint>::iterator iterator, uint step)
{
uint value;
for(uint i = 0; i < step; i++)
{
iterator++;
if(iterator == gl_myList.end())
iterator = gl_myList.begin();
}
value = *iterator;
gl_myList.erase(iterator);
return value;
}
當kill
函數返回時,您正在嘗試將返回值分配給*iterator
,但是您使kill
的迭代器無效!
也許是這樣的:
std::list<uint>::iterator advanceList(std::list<uint>::iterator start, int step) {
for(uint i = 0; i < step; i++) {
start++;
if(start == gl_myList.end())
start = gl_myList.begin();
}
return start;
}
在您的主要代碼中:
while(people > 1) {
iterator = advanceList(iterator, step);
auto tmpIterator = advanceList(iterator, step-1);
*iterator = *tmpIterator;
iterator = gl_myList.erase(tmpIterator);
people--;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.