簡體   English   中英

std :: list iterator.erase()導致無效的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM