Is there any way to avoid this memory leak?
Sainan
sainan@calamity.inc
Thu Aug 7 15:16:14 GMT 2025
Hi, we're working on a Lua-based project in C++, and we noticed that if Lua is compiled to use longjumps, C++ exceptions may leak memory.
I've narrowed it down to the following minimal example:
$ cat main.cpp
#include <setjmp.h>
static jmp_buf jb;
int main() {
if (_setjmp(jb) == 0) {
try {
throw 0;
} catch (const int&) {
_longjmp(jb, 1);
}
}
}
$ clang -o leaky main.cpp -lstdc++
$ valgrind --leak-check=full ./leaky
==4170== Memcheck, a memory error detector
==4170== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4170== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==4170== Command: ./leaky
==4170==
==4170==
==4170== HEAP SUMMARY:
==4170== in use at exit: 132 bytes in 1 blocks
==4170== total heap usage: 2 allocs, 1 frees, 72,836 bytes allocated
==4170==
==4170== 132 bytes in 1 blocks are possibly lost in loss record 1 of 1
==4170== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4170== by 0x491F073: __cxa_allocate_exception (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30)
==4170== by 0x1091BD: main (in /home/sainan/Desktop/leaky/leaky)
==4170==
==4170== LEAK SUMMARY:
==4170== definitely lost: 0 bytes in 0 blocks
==4170== indirectly lost: 0 bytes in 0 blocks
==4170== possibly lost: 132 bytes in 1 blocks
==4170== still reachable: 0 bytes in 0 blocks
==4170== suppressed: 0 bytes in 0 blocks
==4170==
==4170== For lists of detected and suppressed errors, rerun with: -s
==4170== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Is there anything that can be done to free this memory, or should we just give up on trying to make this work?
-- Sainan
More information about the Libstdc++
mailing list