这看起来像是一个释放后使用的问题,其中一个互斥体已经被销毁,可能是因为它拥有的对象被删除了。
我在使用 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
)。
祝您在寻找错误时好运!