antlr4 — жизненный цикл целевого объекта C ++

Я пытаюсь изменить время выполнения, чтобы не использовать общие указатели и никаких блокировок.
Я заменил их всех, чтобы использовать вместо них новый оператор, пока все хорошо, среда выполнения по-прежнему работает правильно, но … происходит очень большое количество утечек памяти (не удивительно).
Каков жизненный цикл таких объектов, как ATNConfig? Где было бы безопасное место, чтобы удалить их?
Обратите внимание, я также заставил сгенерированный парсер использовать нестатический ATN, поэтому мне не нужны блокировки в многопоточном контексте.

Вот пример утечки, которую я получаю:

==4747== 54,736,648 (53,672,160 direct, 1,064,488 indirect) bytes in 1,118,170 blocks are definitely lost in loss record 1,519 of 1,519
==4747==    at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4747==    by 0xAE24F0: antlr4::atn::ParserATNSimulator::getEpsilonTarget(antlr4::atn::ATNConfig*, antlr4::atn::Transition*, bool, bool, bool, bool) (ParserATNSimulator.cpp:1050)
==4747==    by 0xAE1D01: antlr4::atn::ParserATNSimulator::closure_(antlr4::atn::ATNConfig*, antlr4::atn::ATNConfigSet*, std::unordered_set<antlr4::atn::ATNConfig*, antlr4::atn::ATNConfig::Hasher, antlr4::atn::ATNConfig::Comparer, std::allocator<antlr4::atn::ATNConfig*> >&, bool, bool, int, bool) (ParserATNSimulator.cpp:894)

0

Решение

Я много думал о решении без умных указателей для среды выполнения ANTLR4 C ++, потому что они замедляют обработку, но не могут ее найти. DFA и, в частности, экземпляры ATNConfig организованы в виде сетки, ссылающейся друг на друга. Там нет центральной инстанции, которая управляет ими. Они (как Java) создаются и уничтожаются во многих местах во время предсказания.

Вместо этого может помочь замена общих указателей в вызовах функций на необработанные указатели в тех случаях, когда это не влияет на время жизни этих указателей. Но я сомневаюсь, что это принесет более чем несколько процентов скорости.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector