Как перераспределить память в любом случае, даже если realloc () не удалось в c ++
В подлинном C ++ вы никогда не используете malloc
или realloc
, просто new
(что реализовано в вашей стандартной библиотеке C ++ реализация и будет вызывать malloc
внутренне!) и delete
(обычно он вызывает free
), а предпочтительно стандартные контейнеры и интеллектуальные указатели . Условия нехватки памяти обрабатываются исключениями (такими как std::bad_alloc
), и вы можете catch
эти исключения.
В C надежным решением было бы не использовать realloc
, а просто использовать malloc
, calloc
и free
(с memset
для очистки области и 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 - это дает замечательную проницательность.