NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Я использовал коллектор Boehm в прошлом с хорошим успехом. Это - открытый исходный код и может использоваться в коммерческом программном обеспечении.
Это - консервативный коллектор и имеет долгую историю разработки одним из передовых исследователей в технологии сборки "мусора".
Повышение имеет большой диапазон интеллектуальные указатели , которые реализуют подсчет ссылок или удаляют на объеме выход или навязчивый подсчет ссылок. Они доказали достаточно для наших потребностей. Большое плюс - то, что это все бесплатно, открытый исходный код, шаблонный C++. потому что это - подсчет ссылок, в большинстве случаев это очень детерминировано, когда объект уничтожается.
сборщик "мусора" Boehm в свободном доступе, и предположительно довольно хорош (никакой собственный опыт самостоятельно)
([PDF, ПРЕДУПРЕЖДАЮЩИЙ] Теоретическая бумага [приблизительно 111] C++ 0x предложение по сборщику "мусора" Boehm )
, Это, как первоначально говорили, сделало C++ 0x , но не сделает его после всего (из-за ограничений времени, которые я предполагаю).
Proprosal N2670 (минимальная поддержка сборщиков "мусора") действительно становился утвержденным в июне 2008, хотя, поэтому поскольку реализации компилятора берут на этом, и стандарт завершен, мир сборки "мусора" там для C++, несомненно, изменится...
Единственным, о котором я знаю, является Boehm, который в нижней части является традиционной меткой и разверткой. Это, вероятно, использует различные методы для оптимизации этого, но обычно возрастающее/поколений/уплотнение GC будет трудно создать для C++, не идя для управляемого подмножества такой как, что можно получить с.Net C++. Некоторые подходы, которые должны переместить указатели, могут быть реализованы с поддержкой компилятора прикрепления указателей или блоков чтения-записи, хотя, но эффект на производительность может быть слишком большим, и это - не обязательно нетривиальные изменения в GC.
Главная трудность с GC в C++ является потребностью обработать несовместные модули в смысле GC. т.е., для контакта с библиотеками, которые никогда не писались с GC в памяти.
Поэтому GC Boehm часто предлагается.
Вот коммерческий продукт, который я нашел, просто искав то же самое
HnxGC http://hnxgc.harnixworld.com/
Когда-то был также продукт под названием Great Circle от Geodesic Systems, но похоже, что они его больше не продают. Не знаю, продал ли этот товар кому-нибудь еще.
Вы также можете использовать Microsoft Managed C ++. CLR и GC очень надежны и используются в серверных продуктах, но вы должны использовать типы CLR, чтобы GC действительно собирал - вы не можете просто перекомпилировать существующий код и удалить все операторы удаления.
Я бы предпочел используйте C # для написания совершенно нового кода, но Managed C ++ позволяет развивать кодовую базу более прогрессивным образом.
Прочтите это и внимательно ознакомьтесь с выводами:
Выводы
- Комплексное решение проблемы, для которой широко используются простые решения и которые будут улучшены с помощью C + + 0x оставляет нам мало нужды.
- У нас практически нет опыта работы с рекомендуемыми языковыми функциями, которые должны быть стандартизированы.
- Исправление плохой программной сложной системы никогда не будет работать.
Рекомендовать незначительные изменения языка для улучшения будущей поддержки GC - запретить скрытие указателей ( xor list trick) в качестве одного из примеров.
Наконец - адресуйте аргумент «C ++ плох, потому что он не имеет GC». C ++ не генерирует мусор, поэтому сборщик мусора не нужен . Очевидно, что Java, C #, Objective C и т. Д. Создают много мусора.
Да, последнее предложение субъективно и также является частью священных войн.
Наконец - адресуйте аргумент «C ++ плох, потому что он не имеет GC». C ++ не генерирует мусор, поэтому сборщик мусора не нужен . Очевидно, что Java, C #, Objective C и т. Д. Создают много мусора.
Да, последнее предложение субъективно и также является частью священных войн.
Наконец - адресуйте аргумент «C ++ плох, потому что он не имеет GC». C ++ не генерирует мусор, поэтому сборщик мусора не нужен . Очевидно, что Java, C #, Objective C и т. Д. Создают много мусора.
Да, последнее предложение субъективно и также является частью священных войн.
Я использую C ++, потому что мне не нравится мысль о том, что кому-то нужно выносить за меня мусор.
Это делает мэрия, и мне этого достаточно.
Если вам нужен GC, используйте другой язык. Выберите подходящий инструмент для правильной работы.
Я часто использую boehm-gc. Его легко использовать, но документация очень скудная. Существует страница C ++, но ее довольно сложно найти.
По сути, вы просто должны убедиться, что каждый класс наследуется от своего базового класса, и что вы всегда передаете gc_allocator контейнеру. В ряде случаев вы хотите использовать libgccpp для обнаружения других применений new и delete. Это в основном изменения высокого уровня, и мы обнаруживаем, что можем выключить сборщик мусора во время компиляции с помощью #ifdef, и что поддержка этого влияет только на один или два файла.
Моя основная проблема в том, что вы больше не можете использовать Valgrind, если не включите коллектор отключается первым. Хотя отключить сборщик легко и не требуется перекомпиляция, очевидно, что его невозможно использовать, если у вас начинает не хватать памяти.