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]
处的向量,这是越界访问。
我一直在处理 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]
处的向量,这是越界访问。