使用全局声明的向量时,C++双重释放错误/损坏
Double free error/ corruption in C++ while using globally declared vectors
对于此代码,
#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("%llun", day_count);
v1.clear();
v2.clear();
}
return 0;
}
我得到了我想要的输出,但在主执行"返回 0"后,我收到此错误
*** Error in `./a.out': double free or corruption (!prev): 0x0000000001d62e20 ***
我使用另一个代码得到了答案,但我想了解为什么这个代码会出现此错误。
我不认为SpreadTheWord((有什么问题,但以防万一你想看看SpreadTheWord((做了什么
long long int SpreadTheWord(long long int n){
long long int dc = 0;
long long int i = 0, j, m;
j = i + 1;
long long int k = v1[i];
v2[i] = 2;
while(true){
if(v2[n-1] == 2){ //condition 1
return dc;
}
if(k!=0 && v2[i] == 2){ //condition 2
v2[j] = 1;
k--;
j++;
}
else if(k==0){ //condition 3
i++;
if(v2[i] == 2) //condition 3.1
k = v1[i];
else{ //condition 3.2
m= 0;
while(v2[m] != 0){
v2[m] = 2;
m++;
}
i = 0;
dc++;
k = v1[i];
}
}
}
return dc;
}
谢谢!
编辑:对不起,我忘了附加输入
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
问题来自这里:https://www.codechef.com/SNCKQL19/problems/SPREAD2
while(v2[m] != 0){
v2[m] = 2;
m++;
}
if(k!=0 && v2[i] == 2){ //condition 2
v2[j] = 1;
k--;
j++;
}
证明v2[j]
和v2[m]
总是在v2
的范围内是不平凡的。
一般来说,SpreadTheWord
是一堆意大利面条逻辑,可能正在破坏堆。
将[x]
替换为.at(x)
以获取异常而不是内存损坏。
尽可能接近其初始化时声明变量,并尽快使它们超出范围,以减少变量的长度并减少程序具有的"状态"数量。
给变量起个合理的名字。
处理以下可能性:
for(i=0; i<n; i++){
scanf("%llu", &x);
v1.push_back(x);
v2.push_back(0);
}
n
在这里为零。
您的代码执行足够的指针和索引算术,如果它没有通过在向量上越界写入来破坏堆,我会感到惊讶。
相关文章:
- 释放错误后堆使用
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 使用全局声明的向量时,C++双重释放错误/损坏
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 错误:"释放后使用包装器对象 (WRAPPER_ESCAPE)"
- 释放动态内存时C++错误
- 双重释放或损坏(输出)和中止(核心转储)错误
- AddressSanitizer 将 std::vector<T>::p ush_back 标识为释放后堆使用错误的原因
- 如何修复对象在释放后可能修改的malloc错误
- 错误:释放指针未分配在矢量模板类C 中
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 双重释放或损坏错误(找不到错误?
- 删除指针时,未分配被释放的 C++ 指针错误
- 对于我的类函数,我得到双重释放或损坏错误
- C++复制构造函数上的双重释放错误
- 如何在我的 c++ 代码中获取运行时的双重释放错误
- 在先前关闭的文件句柄上的 fclose() 上出现双重释放错误
- std::string试图释放错误的内存
- 内存分配/释放错误(非常小的代码)
- 在解构器中删除指针后执行时出现双重释放错误