Каждую 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
Предисловие. Настоятельно рекомендуется избегать необработанных указателей, таких как
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;