为什么双重自由或腐败?
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;
}
}
当内存分配失败时,异常处理。但是,该程序将死亡。
我犯了一个错误?
输出:
Error in `./TEST': double free or corruption (out): 0x34b00418
您的 catch
子句已损坏。您从 delete[] US_INT[i]
开始,如果第一个 new
导致异常,则它无效。修复:使用 std::vector<>
。没有合理的方法来找出 257 个分配中的哪一个被抛出,因此您不知道要撤消什么。
前言。强烈建议避免使用原始指针,例如
unsigned short int** US_INT
要么使用向量中的向量,要么使用 single-dimension 向量并访问 vec.at(X + Y*sizeX);
这样的元素
为什么程序会死掉?
异常可能在分配US_INT个元素的过程中抛出,因此,数组的一部分是有效的,而数组的一部分是未初始化的垃圾。在 CATCH 中,您正在删除整个数组中的指针。由于删除未初始化的指针是未定义的行为 - 这是此处 UB 的可能结果之一。
我可以像其他人一样推荐,使用std::vector<>
!!!您将在几行人人都可以阅读的代码中实现相同的目标。
cnt=cnt+(256/255);
好吧 256/255
等于 1
所以你可以把它改写成 ++cnt;
每 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;
}
}
当内存分配失败时,异常处理。但是,该程序将死亡。 我犯了一个错误? 输出:
Error in `./TEST': double free or corruption (out): 0x34b00418
您的 catch
子句已损坏。您从 delete[] US_INT[i]
开始,如果第一个 new
导致异常,则它无效。修复:使用 std::vector<>
。没有合理的方法来找出 257 个分配中的哪一个被抛出,因此您不知道要撤消什么。
前言。强烈建议避免使用原始指针,例如
unsigned short int** US_INT
要么使用向量中的向量,要么使用 single-dimension 向量并访问 vec.at(X + Y*sizeX);
这样的元素为什么程序会死掉?
异常可能在分配US_INT个元素的过程中抛出,因此,数组的一部分是有效的,而数组的一部分是未初始化的垃圾。在 CATCH 中,您正在删除整个数组中的指针。由于删除未初始化的指针是未定义的行为 - 这是此处 UB 的可能结果之一。
我可以像其他人一样推荐,使用std::vector<>
!!!您将在几行人人都可以阅读的代码中实现相同的目标。
cnt=cnt+(256/255);
好吧 256/255
等于 1
所以你可以把它改写成 ++cnt;