当前位置: 技术问答>linux和unix
GTK程序在退出时出现free错误
来源: 互联网 发布时间:2016-12-01
本文导语: 用GTK写了一个OSD库,编译成.so。主程序使用界面时就调用.so中的方法。 功能都实现了,但是调用exit(0)或者gtk_main_quit退出程序时提示 *** glibc detected *** free(): invalid pointer: 0x080ba0c0 *** 或者 *** glibc detected *** ...
用GTK写了一个OSD库,编译成.so。主程序使用界面时就调用.so中的方法。
功能都实现了,但是调用exit(0)或者gtk_main_quit退出程序时提示
*** glibc detected *** free(): invalid pointer: 0x080ba0c0 ***
或者
*** glibc detected *** double free()
应该是释放资源时出错,可实在找不到哪里出了问题。
gdb 调试出错的地方在:
where
#0 0xb7fe1424 in __kernel_vsyscall ()
#1 0xb7c89941 in raise () from /lib/libc.so.6
#2 0xb7c8ce42 in abort () from /lib/libc.so.6
#3 0xb7cc1305 in ?? () from /lib/libc.so.6
#4 0xb7ccb501 in ?? () from /lib/libc.so.6
#5 0xb7ccfec6 in free () from /lib/libc.so.6
#6 0xb7ea9441 in operator delete(void*) () from /usr/lib/libstdc++.so.6
#7 0xb7e8bacd in std::basic_string::_Rep::_M_destroy(std::allocator const&) ()
from /usr/lib/libstdc++.so.6
#8 0x0805d41b in CStdStr::~CStdStr() ()
#9 0xb7c8ea68 in __cxa_finalize () from /lib/libc.so.6
#10 0xb7f0ae74 in __do_global_dtors_aux () from /usr/lib/libGTKOSD.so
#11 0xb7f30a10 in _fini () from /usr/lib/libGTKOSD.so
#12 0xb7ff0d66 in ?? () from /lib/ld-linux.so.2
#13 0xb7c8e69e in ?? () from /lib/libc.so.6
#14 0xb7c8e70f in exit () from /lib/libc.so.6
#15 0xb7c75cef in __libc_start_main () from /lib/libc.so.6
#16 0x08059cf1 in _start ()
在网上找了个方法 export MALLOC_CHECK_=0,这样虽然能屏蔽调打印的语句,但是没有实际上解决这个问题。
不知道谁遇到过?
功能都实现了,但是调用exit(0)或者gtk_main_quit退出程序时提示
*** glibc detected *** free(): invalid pointer: 0x080ba0c0 ***
或者
*** glibc detected *** double free()
应该是释放资源时出错,可实在找不到哪里出了问题。
gdb 调试出错的地方在:
where
#0 0xb7fe1424 in __kernel_vsyscall ()
#1 0xb7c89941 in raise () from /lib/libc.so.6
#2 0xb7c8ce42 in abort () from /lib/libc.so.6
#3 0xb7cc1305 in ?? () from /lib/libc.so.6
#4 0xb7ccb501 in ?? () from /lib/libc.so.6
#5 0xb7ccfec6 in free () from /lib/libc.so.6
#6 0xb7ea9441 in operator delete(void*) () from /usr/lib/libstdc++.so.6
#7 0xb7e8bacd in std::basic_string::_Rep::_M_destroy(std::allocator const&) ()
from /usr/lib/libstdc++.so.6
#8 0x0805d41b in CStdStr::~CStdStr() ()
#9 0xb7c8ea68 in __cxa_finalize () from /lib/libc.so.6
#10 0xb7f0ae74 in __do_global_dtors_aux () from /usr/lib/libGTKOSD.so
#11 0xb7f30a10 in _fini () from /usr/lib/libGTKOSD.so
#12 0xb7ff0d66 in ?? () from /lib/ld-linux.so.2
#13 0xb7c8e69e in ?? () from /lib/libc.so.6
#14 0xb7c8e70f in exit () from /lib/libc.so.6
#15 0xb7c75cef in __libc_start_main () from /lib/libc.so.6
#16 0x08059cf1 in _start ()
在网上找了个方法 export MALLOC_CHECK_=0,这样虽然能屏蔽调打印的语句,但是没有实际上解决这个问题。
不知道谁遇到过?
|
仔细检查代码吧,好像没什么好办法。
*** glibc detected *** free(): invalid pointer: 0x080ba0c0 ***
试图free一个不是由malloc得到的指针,比如这样
int i;
free(&i); // invalid pointer
*** glibc detected *** double free()
同一指针free了两次,比如
char p=malloc(100);
free(p);
free(p); // double free
*** glibc detected *** free(): invalid pointer: 0x080ba0c0 ***
试图free一个不是由malloc得到的指针,比如这样
int i;
free(&i); // invalid pointer
*** glibc detected *** double free()
同一指针free了两次,比如
char p=malloc(100);
free(p);
free(p); // double free
|
应该是你手动delete什么组件了。
或是你乱用destroy信号了,那个信号不能随便用,想用就用delete。
gtk的所有组件是自动删除的,不能手动delete。
或是你乱用destroy信号了,那个信号不能随便用,想用就用delete。
gtk的所有组件是自动删除的,不能手动delete。