为什么双重自由或腐败
why double free or corruption?
每 1 秒,函数工作。我的系统是Linux。跑步突然死亡。
-----全球-------
static int arrayNum[33000];
-------------------
function(){
unsigned short int** US_INT;
try{
US_INT= new unsigned short int*[255];
for(int i = 0; i < 255; i++)
{
US_INT[i] = new unsigned short int[128];
memset(US_INT[i], 0, sizeof(unsigned short int) * 128);
}
double x;
double y;
int cnt= 0;
int nArrayCount=0;
for(int i = 0; i < 255; i++)
{
for(int j=0;j<128;j++){
x=j;
y=cnt
arrayNum[nArrayCount]=US_INT[i][j];
nArrayCount++;
}
cnt=cnt+(256/255);
}
for(int i = 0; i < 255; i++)
{
delete[] US_INT[i];
}
delete[] US_INT;
}
catch (const std::bad_alloc&) {
qDebug() << "alloc error";
for(int i = 0; i < 255; i++)
{
delete[] US_INT[i];
}
delete[] US_INT;
}
}
当内存分配失败时,异常处理。但是,该程序将死亡。我搞错了?输出:
"./TEST"中的错误:双重释放或损坏(输出):0x34b00418
前言。强烈建议避免使用原始指针,例如
unsigned short int** US_INT
要么使用向量的向量,要么使用单维向量和访问元素,如 vec.at(X + Y*sizeX);
为什么程序会死?
异常可能在分配US_INT元素的过程中引发,因此,数组的一部分是有效的,数组的一部分是未初始化的垃圾。在 CATCH 中,您将删除整个数组中的指针。由于删除未初始化的指针是未定义的行为 - 这是此处 UB 的可能结果之一。
您的catch
子句已损坏。您从delete[] US_INT[i]
开始,如果第一个new
导致异常,则该无效。解决方法:使用 std::vector<>
.没有合理的方法来弄清楚 257 个分配中的哪一个抛出了,因此您不知道要撤消什么。
我可以推荐与其他人相同的,请使用std::vector<>
!!!您将在每个人都可以阅读的几行代码上实现相同的结果。
cnt=cnt+(256/255);
好吧256/255
等于1
,因此您可以将其重写为++cnt;
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么成员函数地址离自由函数这么远?
- 为什么未调用自由函数作为构造函数中的参数传递
- 为什么命名空间内的自由功能模棱两可
- 为什么标准允许我在没有析构函数的情况下自由存储分配类
- 双重自由或腐败 - 为什么
- 为什么类成员函数使用相同名称阴影自由函数
- 为什么我们可以检测 SFINAE 中 operator() 的默认参数值的存在,而不是自由函数和 PMF 的默认参数值
- 为什么 std::bind1st 不适用于自由函数
- 为什么双重自由或腐败
- 为什么在运算符重载中会出现自由错误
- 为什么会出现这种双自由错误
- 为什么泛型编程设计更喜欢自由函数而不是成员函数
- 为什么自由函数指针总是指针类型,而成员函数指针实际上不是指针?
- 为什么字符串上的双自由运算符=
- 这种代码理论上会有双重自由,但为什么没有重复
- 为什么我更喜欢使用自由存储而不是堆
- 为什么编译器不会自动内联自由定义的函数?而是导致链接器错误