C++ C+中的双自由错误/损坏+;使用全局声明的向量时
对于此代码C++ C+中的双自由错误/损坏+;使用全局声明的向量时,c++,stl,global-variables,stdvector,double-free,C++,Stl,Global Variables,Stdvector,Double Free,对于此代码 #include<bits/stdc++.h> #include<iostream> #include<vector> using namespace std; vector<long long int> v1,v2; int main(int argc, char const *argv[]){ long long int t, n, i, x, day_count; scanf("%ll
#include<bits/stdc++.h>
#include<iostream>
#include<vector>
using namespace std;
vector<long long int> v1,v2;
int main(int argc, char const *argv[]){
long long int t, n, i, x, day_count;
scanf("%llu", &t);
while(t--){
scanf("%llu", &n);
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}
day_count = SpreadTheWord(n);
printf("%llu\n", day_count);
v1.clear();
v2.clear();
}
return 0;
}
我用另一个代码得到了答案,但我想知道为什么这个代码会出现这个错误
我不认为SpreadTheWord()有什么问题,但以防您想知道SpreadTheWord()的功能
谢谢大家!
编辑:对不起,我忘了附加输入
3
10
1 1 1 1 1 1 1 1 1 1
10
2 2 2 2 2 2 2 2 2 2
10
3 3 3 3 3 3 3 3 3 3
问题就出在这里:
证明v2[j]
和v2[m]
始终在v2
的范围内是非常重要的
一般来说,SpreadTheWord
是一堆意大利面逻辑,可能会破坏堆
将
[x]
替换为.at(x)
,以获取异常而不是内存损坏
声明变量,使其尽可能接近其初始化,并使其尽快脱离作用域,以减少变量悬空的长度,并减少“状态”程序的数量
给varaibles起个合理的名字
处理以下可能性:
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}
(i=0;i)的
证明v2[j]
和v2[m]
始终在v2
的范围内是非常重要的
一般来说,SpreadTheWord
是一堆意大利面逻辑,可能会破坏堆
将[x]
替换为.at(x)
,以获取异常而不是内存损坏
声明变量,使其尽可能接近其初始化,并使其尽快脱离作用域,以减少变量悬空的长度,并减少“状态”程序的数量
给varaibles起个合理的名字
处理以下可能性:
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}
for(i=0;i请提供输入设置初始值和不等待输入可能会更容易。我输入了“0\n”并且没有复制。如果输入2
,您可以访问超出范围的向量:v2[j]=1
。编译调试bui,d调试构建通常检查向量元素是否使用超出范围的索引进行访问。我现在为问题添加了一个输入。您可以查看链接(问题中提供)用于另一个输入。谢谢!请提供输入。设置初始值和不等待输入可能会更容易。我输入了“0\n”,但没有复制。如果输入2
,您可以在此处访问超出范围的向量:v2[j]=1
。编译调试bui,d调试构建通常检查是否使用超出范围的索引访问向量元素。我现在已为问题添加了一个输入。您可以查看链接(问题中提供)以获取其他输入。谢谢!
while(v2[m] != 0){
v2[m] = 2;
m++;
}
if(k!=0 && v2[i] == 2){ //condition 2
v2[j] = 1;
k--;
j++;
}
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}