Sysmalloc:使用向量的断言错误

时间:2018-07-26 21:28:08

标签: c++ vector malloc c++14 assertion

在进行这种lesson编码时,我遇到了一些奇怪的行为。

int solution(std::vector<int> &A) {
    std::vector<int> B, C;
    B.resize(std::count_if(A.begin(), A.end(), [](int x){return x < 0;}));
    C.resize(A.size() - B.size());
    std::copy(A.begin(), std::remove_copy_if(A.begin(), A.end(), B.begin(), [](int x){return x > 0;}), C.begin());

    std::sort(A.begin(), A.end(), [](int x, int y){return x > y;});
    std::sort(B.begin(), B.end(), [](int x, int y){return x < y;});
    std::sort(C.begin(), C.end(), [](int x, int y){return x > y;});

函数的此部分将向量分成两个向量,第一个为正整数,第二个为负整数。然后将所有向量按所需顺序排序。

    if (B.size() >= static_cast<size_t>(2)) {
        if (C.size() >= static_cast<size_t>(3)) {
            if (B[0] * B[1] > C[1] * C[2])
                return B[0] * B[1] * C[0];
        } else if(C.size() == static_cast<size_t>(2)) {
            if (B[0] * B[1] > C[0] * C[1])
                return B[0] * B[1] * C[0];
        }
    }
    return A[0] * A[1] * A[2];
}

这部分从输入向量中找出3个元素的最大乘积。

返回后,函数崩溃,并且出现错误:

a.out: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) &&
old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) &&
((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted

我尝试对其进行调试,我发现在return语句之后,调试器跳转到B&C矢量声明,然后跳转到现有的大括号。 我从未见过类似的东西,我想了解它。我在Linux下使用g ++-7.1,并使用--std = c ++ 14标志进行编译。 预先感谢。

1 个答案:

答案 0 :(得分:2)

首先,这里的lambda:

B.resize(std::count_if(A.begin(), A.end(), [](int x){return x < 0;}));

在这里:

std::copy(A.begin(),
          std::remove_copy_if(A.begin(), A.end(), B.begin(),
                              [](int x){return x > 0;}),
          C.begin());

如果要确保std::remove_copy_ifB中有足够的空间,则必须相互补充。它们不会-都为false返回0

但是主要的问题是,在我们的案例中(解决了上述问题之后)std::remove_copy_if返回了B.end(),这与A.begin()不兼容。我也建议弄清楚这一点,因为我也感到困惑。

std::remove_copy_if不会修改输入范围,只有std::copy_if带有否定谓词-似乎是另一个误解。


似乎您只是想对A进行分区,同时使元素保持顺序。之后,对所有三个向量进行排序,这意味着您可以首先对A的{​​{1}} / std::lower_bound进行排序,然后继续使用算法,而无需使用{{1} }和std::upper_bound-使用一些迭代器算法而不是建立索引。