Библиотеки сборки "мусора" в [закрытом] C++

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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

65
задан Coding Mash 8 September 2012 в 18:23
поделиться

9 ответов

Я использовал коллектор Boehm в прошлом с хорошим успехом. Это - открытый исходный код и может использоваться в коммерческом программном обеспечении.

Это - консервативный коллектор и имеет долгую историю разработки одним из передовых исследователей в технологии сборки "мусора".

27
ответ дан dubek 24 November 2019 в 15:31
поделиться

Повышение имеет большой диапазон интеллектуальные указатели , которые реализуют подсчет ссылок или удаляют на объеме выход или навязчивый подсчет ссылок. Они доказали достаточно для наших потребностей. Большое плюс - то, что это все бесплатно, открытый исходный код, шаблонный C++. потому что это - подсчет ссылок, в большинстве случаев это очень детерминировано, когда объект уничтожается.

22
ответ дан Tom Leys 24 November 2019 в 15:31
поделиться

сборщик "мусора" Boehm в свободном доступе, и предположительно довольно хорош (никакой собственный опыт самостоятельно)

([PDF, ПРЕДУПРЕЖДАЮЩИЙ] Теоретическая бумага [приблизительно 111] C++ 0x предложение по сборщику "мусора" Boehm )

, Это, как первоначально говорили, сделало C++ 0x , но не сделает его после всего (из-за ограничений времени, которые я предполагаю).

Proprosal N2670 (минимальная поддержка сборщиков "мусора") действительно становился утвержденным в июне 2008, хотя, поэтому поскольку реализации компилятора берут на этом, и стандарт завершен, мир сборки "мусора" там для C++, несомненно, изменится...

9
ответ дан Pieter 24 November 2019 в 15:31
поделиться

Единственным, о котором я знаю, является Boehm, который в нижней части является традиционной меткой и разверткой. Это, вероятно, использует различные методы для оптимизации этого, но обычно возрастающее/поколений/уплотнение GC будет трудно создать для C++, не идя для управляемого подмножества такой как, что можно получить с.Net C++. Некоторые подходы, которые должны переместить указатели, могут быть реализованы с поддержкой компилятора прикрепления указателей или блоков чтения-записи, хотя, но эффект на производительность может быть слишком большим, и это - не обязательно нетривиальные изменения в GC.

2
ответ дан larsivi 24 November 2019 в 15:31
поделиться

Главная трудность с GC в C++ является потребностью обработать несовместные модули в смысле GC. т.е., для контакта с библиотеками, которые никогда не писались с GC в памяти.

Поэтому GC Boehm часто предлагается.

2
ответ дан Arafangion 24 November 2019 в 15:31
поделиться

Вот коммерческий продукт, который я нашел, просто искав то же самое

HnxGC http://hnxgc.harnixworld.com/

Когда-то был также продукт под названием Great Circle от Geodesic Systems, но похоже, что они его больше не продают. Не знаю, продал ли этот товар кому-нибудь еще.

1
ответ дан 24 November 2019 в 15:31
поделиться

Вы также можете использовать Microsoft Managed C ++. CLR и GC очень надежны и используются в серверных продуктах, но вы должны использовать типы CLR, чтобы GC действительно собирал - вы не можете просто перекомпилировать существующий код и удалить все операторы удаления.

Я бы предпочел используйте C # для написания совершенно нового кода, но Managed C ++ позволяет развивать кодовую базу более прогрессивным образом.

1
ответ дан 24 November 2019 в 15:31
поделиться

Прочтите это и внимательно ознакомьтесь с выводами:

Выводы

  • Комплексное решение проблемы, для которой широко используются простые решения и которые будут улучшены с помощью 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, используйте другой язык. Выберите подходящий инструмент для правильной работы.

    1
    ответ дан 24 November 2019 в 15:31
    поделиться

    Я часто использую boehm-gc. Его легко использовать, но документация очень скудная. Существует страница C ++, но ее довольно сложно найти.

    По сути, вы просто должны убедиться, что каждый класс наследуется от своего базового класса, и что вы всегда передаете gc_allocator контейнеру. В ряде случаев вы хотите использовать libgccpp для обнаружения других применений new и delete. Это в основном изменения высокого уровня, и мы обнаруживаем, что можем выключить сборщик мусора во время компиляции с помощью #ifdef, и что поддержка этого влияет только на один или два файла.

    Моя основная проблема в том, что вы больше не можете использовать Valgrind, если не включите коллектор отключается первым. Хотя отключить сборщик легко и не требуется перекомпиляция, очевидно, что его невозможно использовать, если у вас начинает не хватать памяти.

    9
    ответ дан 24 November 2019 в 15:31
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: