У меня есть функция, которая принимает массив строк ( буфер ) и нуждается в увеличении его размера.
Поэтому я вызываю realloc
temp = (char**) realloc (buffer, newSize * (sizeof(char*)));
if (temp == NULL)
return false;
else
buffer = temp;
И пока все хорошо. Теперь для каждой новой ячейки я должен вызывать malloc с правильным размером. Обратите внимание, что newSize всегда четный и длина нечетных строк отличается от четных.
for (i = oldSize; i < newSize; i++){
support = (char*) malloc (LENGTH1 * sizeof(char));
if (support == NULL){
marker = i;
failedMalloc = true;
break;
}
else
buffer[i] = support;
i++;
support = (char*) malloc (LENGTH2 * sizeof(char));
if (support == NULL){
marker = i;
failedMalloc = true;
break;
}
else
buffer[i] = support;
}
Дело в том, что, так как я рано или поздно работаю с большими данными, я закончу память, и realloc или один из mallocs потерпит неудачу. Проблема в том, что, если это один из malloc, который выходит из строя, есть риск, что мне придется вызвать миллионов бесплатно, чтобы очистить часть памяти. Это занимает много времени. Есть ли способ ускорить этот процесс или даже лучше его избежать?
if (failedMalloc){
for (i = oldRows; i < marker; i++)
free(buffer[i]);
temp = (char**) realloc (buffer, oldRows * (sizeof(char*)));
}
PS: Да, я знаю, что арифметика указателей быстрее, чем индексация массива. Я реализую ее, когда найду способ решить эту проблему, на данный момент я предпочитаю использовать индексацию массива, потому что я нахожу ее меньше подвержен ошибкам Но окончательная версия будет использовать арифметику указателей