c++ - std::list iterator.erase() 导致无效指针

标签 c++ c++11

您好,我在使用 std::list 时遇到了问题,在调用删除函数时出现了 free(): invalid pointer 错误,并且然后迭代到该元素。我希望它会跳过那个元素,因为它被删除了......我的第一个假设是你可能需要一个新的迭代器,因为前一个已经过时了。所以我的解决方案是将我的迭代器设置为 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;
}

最佳答案

也许是这样的:

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--;
}

关于c++ - std::list iterator.erase() 导致无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21225558/

相关文章:

c++ - 为什么会出现编译错误?

C++ - 如何提高这个方法的执行速度

c++ - 将输入文件中的子字符串转换为 double 值?

c++ - 我应该只对构造函数和移动运算符写 noexcept 吗?

c++ - 线程间通信

c++ - 按类型构造一个 std::mem_fn

c++ - 分配另一个 std::vector 的 std::vector 地址

c++ - ld : symbols not found for architecture x86_64, clang: 链接器命令失败

c++ - QVideoWidget是离开全屏后的新窗口

c++ - QStateMachine - QMouseEvent