C ++目标对象生命周期

时间:2018-10-17 05:31:34

标签: c++ antlr4

我正在尝试将运行时修改为不使用共享指针且没有锁。 我确实替换了所有它们,以使用new运算符代替,到目前为止,运行时仍然可以正确运行,但是...存在大量内存泄漏(不足为奇)。 像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 :(得分:0)

我对ANTLR4 C ++运行时没有智能指针的解决方案进行了认真的思考,因为它们会使处理变慢,但找不到。 DFA尤其是ATNConfig实例的组织方式像一个网格,相互引用。没有管理它们的中央实例。它们是(像Java一样)在预测期间在许多地方创建和销毁的。

相反,在不影响那些指针寿命的情况下,可以用原始指针代替函数调用中的共享指针。但是我怀疑这将带来超过百分之几的速度胜利。