почему двойная свобода или коррупция?

Каждую 1 секунду функция работает.
моя система линукс. Беги внезапно умирает.

——Глобальный——-

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

-1

Решение

Предисловие. Настоятельно рекомендуется избегать необработанных указателей, таких как

unsigned short int** US_INT

Либо используйте вектор векторов, либо одномерный вектор и элементы доступа, такие как vec.at (X + Y * sizeX);

Почему программа умирает?

Возможно, исключение возникло в середине размещения элементов US_INT, поэтому часть массива является допустимой, а часть массива — неинициализированным мусором. А в CATCH вы удаляете указатели во всем массиве. Так как удаление неинициализированного указателя является неопределенным поведением — это один из возможных результатов UB здесь.

3

Другие решения

Ваш catch пункт нарушен. Вы начинаете с delete[] US_INT[i] который не действителен, если первый new вызвал исключение. Исправить: использовать std::vector<>, Нет никакого разумного способа выяснить, какое из 257 распределений выкинуло, и поэтому вы не знаете, что отменить.

0

Я могу рекомендовать так же, как и другие, использовать std::vector<>!!! Вы добьетесь того же в нескольких строках кода, которые может прочитать каждый.

CNT = CNT + (256/255);

Что ж 256/255 равно 1 так что вы можете переписать его ++cnt;

0
По вопросам рекламы [email protected]