SIGSEGV __gnu_cxx::new_allocator<int>::construct<int, int const&> 在 Codeforces 第 660 轮问题 D 中

SIGSEGV __gnu_cxx::new_allocator<int>::construct<int, int const&> in Codeforces Round #660 Problem D

我一直在处理 CodeForces 第 660 轮的问题 Problem D

我的代码如下::

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> child; //Array of b[i](parent) vs i(child)
vector<long long int> a; //We will update it later, and will be our subtree
vector<int> b,found;


void DFS(int index_ptr ,int *answer){
    if(found[index_ptr] == 0){
        found[index_ptr] = 1;

        //Call childor
        for(int i=0;i<child[index_ptr].size();i++){
            DFS(child[index_ptr][i], answer);
        }

        //As we are traversing back just add the answer
        *answer += a[index_ptr];
        if(a[index_ptr] > 0){
            a[b[index_ptr]] += a[index_ptr];
        }
    }
    return;
}

int main()
{ 
    int n,i,answer;
    cin >> n;   
    a.clear();  
    a.resize(n);
    b.clear();
    b.resize(n);
    found.clear();
    found.resize(n);

    for(i=0;i<n;i++){
        cin >> a[i];
        found[i] = 0;
    }

    vector<int> parent;
    for(i=0;i<n;i++){
        cin >> b[i]; 
        if(b[i]==-1)
            parent.push_back(i);
    }

    child.clear();
    child.resize(n);
    for (i=0;i<n;i++){
        child[b[i]].push_back(i);
    } 
    
    for(i=0;i<parent.size();i++){
        DFS(i, &answer);
    }
    
    cout << answer << endl;
    return 0;
}

但是它returns分段错误

运行gdb后显示如下结果::

Breakpoint 3, main () at flintTreasure_V2.cpp:54
54          child[b[i]].push_back(i);
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x000055555555692d in __gnu_cxx::new_allocator<int>::construct<int, int const&>
    (this=0x55555576e368, __p=0x4)
    at /usr/include/c++/7/ext/new_allocator.h:136
136     { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

我确实用 -Wall 标签编译了它,它没有显示任何我应该关注的警告

我以前从未遇到过这种类型的Segmentation fault,我想这与我的向量分配或使用有关

作为一般性回答:您没有进行任何明确的分配或删除,因此问题很可能源于对其中一个向量的 out-of-bounds 访问。如果您使用 v.at(i) 而不是 v[i] 来访问向量 v 的第 i 个元素,则 out-of-bounds 访问将引发异常,而不是导致分段错误(或更糟)。

更准确地说是这段代码:您正在访问索引 b[i] 处的 child 内的向量,但之前显示 b[i]==-1 是有效或预期的输入。我的猜测是,在没有看到输入数据的情况下,您正试图将一个值推回 child[-1] 处的向量,这是越界访问。