Жизненный цикл целевого объекта C ++ - PullRequest
0 голосов
/ 17 октября 2018

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

1 Ответ

0 голосов
/ 17 октября 2018

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

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

...