Это похоже на проблему использования после освобождения, когда мьютекс уже был уничтожен, вероятно, из-за того, что его объект-владелец был удален.
Мне удалось использовать Valgrind для поиска ошибок этого типа. Установите его, используя apt install valgrind
, и добавьте launch-prefix="valgrind"
к <node>
в вашем файле запуска. Он будет очень медленным, но достаточно искусным в выявлении этих проблем.
Возьмем, к примеру, эту программу с ошибками:
struct Test
{
int a;
};
int main()
{
Test* test = new Test();
test->a = 42;
delete test;
test->a = 0; // BUG!
}
valgrind ./testprog
дает
==8348== Invalid write of size 4
==8348== at 0x108601: main (test.cpp:11)
==8348== Address 0x5b7ec80 is 0 bytes inside a block of size 4 free'd
==8348== at 0x4C3168B: operator delete(void*, unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8348== by 0x108600: main (test.cpp:10)
==8348== Block was alloc'd at
==8348== at 0x4C303EF: operator new(unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8348== by 0x1085EA: main (test.cpp:8)
Обратите внимание, как он не только сообщит вам, где произошел ошибочный доступ (test.cpp:11
), но также и где объект Test был удален (test.cpp:10
) и где он был первоначально создан (test.cpp:8
).
Удачи в поиске ошибок!