初始化 2D 向量时出现 sysmalloc 断言错误

sysmalloc assertion error when initializing 2D vector

提问人:Narcisismo 提问时间:9/4/2023 更新时间:9/4/2023 访问量:32

问:

有时,当使用 'std::vectorstd::vector<int> temp(num_vertices_);“' 初始化临时 2D 向量时,c++ 会给我一个 sysmalloc 断言错误。

void Grafo::remove_vertice(int v)
{

    for (int i = 0; i < adj[v].size(); i++)
    {
        num_arestas_--;
    }

    adj[v].clear();

    for (int i = 0; i < adj.size(); ++i)
    {
        for (int j = 0; j < adj[i].size(); ++j)
        {
            if (adj[i].size() == 1)
            {
                if (adj[i][j] > v)
                {
                    adj[i][j] = adj[i][j] - 1;
                    break;
                }
                if (adj[i][j] == v)
                {
                    adj[i].erase(adj[i].begin() + j);
                }
            }
            else
            {
                for (auto x : adj[i])
                {
                    if (adj[i][j] > v)
                    {
                        adj[i][j] = adj[i][j] - 1;
                        break;
                    }
                    if (adj[i][j] == v)
                    {
                        adj[i].erase(adj[i].begin() + j);
                    }
                }
            }
        }
    }

    adj[v].insert(adj[v].begin(), -1);
    num_vertices_--;
    std::vector<std::vector<int>> temp(num_vertices_);
    int lacoTemp = 0;
    for (int i = 0; i < adj.size(); i++)
    {
        if (adj[i].empty())
        {
            lacoTemp++;
        }
        for (int x : adj[i])
        {
            if (x != -1)
            {
                temp[lacoTemp].insert(temp[lacoTemp].begin(), x);
                lacoTemp++;
            }
        }
    }

    adj.clear();
    adj.resize(num_vertices_);

    for (int i = 0; i < adj.size(); i++)
    {
        adj[i] = temp[i];
    }
}

我的输入: 8 12

R 0 7

E

我 4 1

问 5

N

我 5 4

R 0 6

E

问 1

Grafo: malloc.c:2617: sysmalloc: 断言 '(old_top == initial_top (av) && old_size == 0) ||((无符号长) (old_size) >= MINSIZE && prev_inuse (old_top) && ((无符号长) old_end & (pagesize - 1)) == 0)' 失败。

C++ malloc

评论

0赞 Eljay 9/4/2023
可能是缓冲区溢出导致未定义的行为(在本例中,损坏堆)。
1赞 Sam Varshavchik 9/4/2023
仅仅因为这是程序崩溃或报告错误的地方,并不意味着这就是问题所在。C++ 不能以这种方式工作。问题可能出在代码中的任何位置,但在错误发生后,程序会继续运行一段时间,然后最终崩溃。这就是为什么stackoverflow.com的帮助中心要求你展示一个最小的可重现示例,其他人都可以完全按照所示剪切/粘贴,然后编译、运行和重现你的问题。有关详细信息,请参阅如何询问。在你这样做之前,任何人都不太可能回答你的问题。
0赞 PaulMcKenzie 9/4/2023
请发布一个最小的可重现示例。此外,如果您自己编写了此代码,则没有提到您在调试此代码时所做的任何努力。
4赞 Igor Tandetnik 9/4/2023
是吗。这表现出未定义的行为,因为它使循环正在使用的迭代器无效。它看起来也不对,因为从未在循环的主体中实际使用过。for (auto x : adj[i]) { ... adj[i].erase(...) }x
0赞 PaulMcKenzie 9/4/2023
鉴于@IgorTandetnik所做的注释,您可以删除所有与首次使用 .这不需要任何循环。vadj[i].erase(std::remove_if(adj[i].begin(), adj[i].end(), [&](auto &val) { return val == v; }). adj[i].end());for

答: 暂无答案