Как перераспределить память в любом случае, даже если realloc () не удалось в C ++ - PullRequest
3 голосов
/ 19 июня 2019

После успешного выделения с помощью malloc () иногда программе необходимо увеличить размер массива. Хотя malloc () работал успешно, но realloc () не удалось.

Я использовал этот кусок кода для обработки ошибки realloc (). Здесь T - параметр шаблона. массив - указатель типа T, _size - общий индекс массива, который уже был использован, _maxSize - максимальное количество используемых индексов. Перераспределение необходимо, когда _size достигает _maxSize .

if(_size == _maxSize){
    _maxSize *= 2;
    T *temp;
    temp = (T *) realloc( array, sizeof( T ) * (_maxSize) ) ;
    if(temp == NULL){
        printf("...reallocation of memory failed...\n");
        exit(0);
    }
    else{
        array = temp;
    }
}

Хотя ошибка realloc () была обработана, программе действительно необходимо увеличить размер массива , и я не знаю, как выполнить перераспределение, даже если realloc () не удалось.

1 Ответ

6 голосов
/ 19 июня 2019

Как перераспределить память в любом случае, даже если realloc () не удалось в c ++

В подлинном C ++ вы никогда не используете malloc или realloc, просто new (что реализовано в вашей стандартной библиотеке C ++ реализация и будет вызывать malloc внутренне!) и delete (обычно он вызывает free), а предпочтительно стандартные контейнеры и интеллектуальные указатели . Условия нехватки памяти обрабатываются исключениями (такими как std::bad_alloc), и вы можете catch эти исключения.

В C надежным решением было бы не использовать realloc, а просто использовать malloc, calloc и freememset для очистки области и memcpy, чтобы скопировать).

Реальная проблема заключается в том, как ловко обращаться с условиями нехватки памяти. Это проблема дизайна и зависит от приложения. Помните о памятках и методах сбора мусора , понятиях и терминологии. Обратите внимание, что подсчет ссылок является примитивом, но часто используется в C ++, методике сборки мусора. Так что прочитайте справочник GC или хотя бы трассировочную сборку мусора вики-страницу для концепций , которые вас научат.

Помните о чрезмерном выделении памяти . Это особенность ОС, которая мне не нравится.

Также следует помнить, что malloc и free (реализовано в вашей стандартной библиотеке C реализация ) используют примитивы операционной системы (обычно системные вызовы ). Так что читайте больше об ОС, например Операционные системы: три простых пьесы . В Linux эти примитивы ОС (очень часто) mmap (2) и munmap (2) . Поскольку системные вызовы являются дорогостоящими, ваша стандартная библиотека будет стараться их избегать и предпочитает отмечать free -d зоны памяти как многократно используемые в будущем malloc -s.

Используйте valgrind для поиска утечек памяти . Вы бы предпочли разработку кода на C ++ для некоторого дистрибутива Linux , чтобы иметь valgrind. Мое мнение таково, что Linux предоставляет очень дружественную для разработчиков программную среду, поэтому я рекомендую Linux для большинства программистов и студентов. Не забудьте скомпилировать с g++ -Wall -g (может также -O2, при тестировании) и использовать при необходимости адресное дезинфицирующее средство .

В общем, прочитайте http://norvig.com/21-days.html - это дает замечательную проницательность.

...