每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&#39;:双重免费或损坏(输出)错误:0x34b00418
答案 0 :(得分:3)
序。强烈建议避免使用原始指针,例如
unsigned short int** US_INT
使用矢量矢量,或单维矢量和访问元素,如vec.at(X + Y * sizeX);
为什么程序会死?
异常可能在US_INT元素的分配中间抛出,因此,数组的一部分是有效的,并且数组的一部分是未初始化的垃圾。在CATCH中,您将删除整个数组中的指针。由于删除未初始化的指针是未定义的行为 - 这是UB可能的结果之一。
答案 1 :(得分:0)
您的catch
条款已损坏。如果第一个delete[] US_INT[i]
导致异常,则从new
开始,这不是有效的。修复:使用std::vector<>
。没有合理的方法来确定257个分配中的哪一个,因此你不知道要撤消什么。
答案 2 :(得分:0)
我可以推荐与其他人一样,使用<li class="p">
!您将在几行代码中实现相同的目标,每个人都可以阅读。
CNT = CNT +(255分之256);
好std::vector<>
等于256/255
,因此您可以将其重写为1