问题背景
用ANTLR4替代Flex/Bison来开发语法分析部分后,程序每次退出时总会提示内存泄漏(参见这个issue):
Detected memory leaks!
Dumping objects ->
{11750} normal block at 0x0000000000436E90, 128 bytes long.
Data: < C C > 90 04 43 00 00 00 00 00 90 04 43 00 00 00 00 00
{11749} normal block at 0x00000000004202B0, 16 bytes long.
Data: <`iC > 60 69 43 00 00 00 00 00 00 00 00 00 00 00 00 00
{11748} normal block at 0x0000000000430490, 24 bytes long.
Data: < C C > 90 04 43 00 00 00 00 00 90 04 43 00 00 00 00 00
{11747} normal block at 0x000000000041FDB0, 16 bytes long.
Data: <HiC > 48 69 43 00 00 00 00 00 00 00 00 00 00 00 00 00
{11746} normal block at 0x0000000000436F50, 128 bytes long.
Data: < C C > D0 09 43 00 00 00 00 00 D0 09 43 00 00 00 00 00
{11745} normal block at 0x000000000041FB30, 16 bytes long.
Data: < hC > E8 68 43 00 00 00 00 00 00 00 00 00 00 00 00 00
{11744} normal block at 0x00000000004309D0, 24 bytes long.
Data: < C C > D0 09 43 00 00 00 00 00 D0 09 43 00 00 00 00 00
{11743} normal block at 0x000000000041F310, 16 bytes long.
Data: < hC > D0 68 43 00 00 00 00 00 00 00 00 00 00 00 00 00
{11742} normal block at 0x0000000000439B90, 128 bytes long.
Data: <0 C 0 C > 30 04 43 00 00 00 00 00 30 04 43 00 00 00 00 00
{11741} normal block at 0x000000000041FBD0, 16 bytes long.
Data: <phC > 70 68 43 00 00 00 00 00 00 00 00 00 00 00 00 00
(...)
定位/解决问题
在ANTLR中添加VC++内存检测支持后重新编译,定位到内存泄漏来源于以下源文件:
runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp(192)
runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp(295)
runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp(536)
runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp(299)
runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp(465)
runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp(531)
runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp(618)
runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp(636)
runtime/Cpp/runtime/src/dfa/DFA.cpp(29)
runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp(179)
runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp(182)
runtime/Cpp/runtime/src/atn/ATNDeserializer.