C++什么情况下会出现类 static 成员析构错误?

2018-12-04 08:01:46 +08:00
 zhiqiang

我的一个程序,其中一个类有一个static const std::vector<std::string>static成员,在程序结束时__run_exit_handlers里面出现该成员的析构错误。

gdb 错误信息如下:

#0  0x00007ffff6a426c3 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1  0x000000000058e63d in std::_Destroy<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (__pointer=0x99f1f0) at /usr/include/c++/5/bits/stl_construct.h:93
#2  0x000000000058dfcd in std::_Destroy_aux<false>::__destroy<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*> (__first=0x99f1f0, __last=0x99f370)
    at /usr/include/c++/5/bits/stl_construct.h:103
#3  0x000000000058d890 in std::_Destroy<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*> (__first=0x99f1f0, __last=0x99f370)
    at /usr/include/c++/5/bits/stl_construct.h:126
#4  0x000000000058cfd3 in std::_Destroy<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (__first=0x99f1f0, __last=0x99f370) at /usr/include/c++/5/bits/stl_construct.h:151
#5  0x000000000058bf15 in std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~vector (this=0x8e6730 <expr_parser::Token::type_descriptions[abi:cxx11]>, __in_chrg=<optimized out>) at /usr/include/c++/5/bits/stl_vector.h:424
#6  0x00007ffff5c34ff8 in __run_exit_handlers (status=0, listp=0x7ffff5fbf5f8 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true) at exit.c:82
#7  0x00007ffff5c35045 in __GI_exit (status=<optimized out>) at exit.c:104
#8  0x00007ffff5c1b837 in __libc_start_main (main=0x577548 <main()>, argc=1, argv=0x7fffffffdd88, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
    stack_end=0x7fffffffdd78) at ../csu/libc-start.c:325
#9  0x00000000005773e9 in _start ()
3998 次点击
所在节点    C
28 条回复
zhiqiang
2018-12-04 16:45:02 +08:00
@lcdtyph 这不行的。不链编译通不过。
lcdtyph
2018-12-04 16:48:38 +08:00
@zhiqiang 那你的编译器支持 hidden 属性吗,可以把整个 token 类标记成 hidden
zhiqiang
2018-12-04 16:50:18 +08:00
@lcdtyph 我已经解决了,把那些 static 成员标记为 hidden 即可。
zhiqiang
2018-12-04 16:50:53 +08:00
@lcdtyph 你是最接近答案的人 :)
lcdtyph
2018-12-04 16:52:13 +08:00
@zhiqiang
怎么会编译通不过呢,是 exec 引用了在动态库没引用的符号吗,
另外你现在链接时库的顺序是什么,可以的话把那个静态库放在动态库的后面,这样链接器会先在 so 里找到符号
lcdtyph
2018-12-04 16:52:56 +08:00
@zhiqiang 哈哈因为我自己的项目也出国这个情况
zhiqiang
2018-12-04 16:53:24 +08:00
@lcdtyph so 文件是 dlopen 打开的,不是编译时链接。链接时只链接了.a 文件。

现在看 dlopen 的 runtime link 有些难以琢磨的东西。
czhou
2018-12-05 08:39:56 +08:00
dlopen 有全局命名空间和独立命名空间,可以设置,多次打开相似或相同 so 它会重叠,也就是会多次调用同一个函数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/514043

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX