【求助】vector复制的时候程序crash了
gdb看了一下,是copy内存到0x0导致,逻辑是在vector的operator=里乱的。麻烦大侠帮忙看看有什么可能会导致这样的问题。
gdb core文件 bt:
#0 0x00007f13d7920645 in raise () from /lib64/libc.so.6#1 0x00007f13d7921c33 in abort () from /lib64/libc.so.6#2 0x00007f13d8f103f7 in os::abort(bool) () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#3 0x00007f13d906ebad in VMError::report_and_die() () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#4 0x00007f13d906f7c1 in crash_handler(int, siginfo*, void*) () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#5 <signal handler called>#6 0x00007f13d8f0db66 in os::is_first_C_frame(frame*) () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#7 0x00007f13d906db8a in VMError::report(outputStream*) () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#8 0x00007f13d906eac3 in VMError::report_and_die() () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#9 0x00007f13d8f1570c in JVM_handle_linux_signal () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#10 0x00007f13d8f1255e in signalHandler(int, siginfo*, void*) () from /usr/lib64/jvm/java/jre/lib/amd64/server/libjvm.so#11 <signal handler called>#12 0x00007f13d796e1f3 in ?? () from /lib64/libc.so.6#13 0x00007f13d796c3ca in memmove () from /lib64/libc.so.6#14 0x000000000041bf5a in std::__copy_move<false, true, std::random_access_iterator_tag>::__copy_m<char> ( __first=0x7f13d1dd2ed0 "\fF.hdfsgop://7-7@100ce178526dbba4218c6f3dd86b7c04R", __last=0x7f13d1dd2f28 "5", __result=0x0) at /usr/include/c++/4.3/bits/stl_algobase.h:377#15 0x00000000004359f0 in std::__copy_move_a<false, char const*, char*> ( __first=0x7f13d1dd2ed0 "\fF.hdfsgop://7-7@100ce178526dbba4218c6f3dd86b7c04R", __last=0x7f13d1dd2f28 "5", __result=0x0) at /usr/include/c++/4.3/bits/stl_algobase.h:396#16 0x0000000000435b8c in std::__copy_move_a2<false, __gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > > (__first= {_M_current = 0x7f13d1dd2ed0 "\fF.hdfsgop://7-7@100ce178526dbba4218c6f3dd86b7c04R"}, __last= {_M_current = 0x7f13d1dd2f28 "5"}, __result={_M_current = 0x0}) at /usr/include/c++/4.3/bits/stl_algobase.h:435#17 0x0000000000435be3 in std::copy<__gnu_cxx::__normal_iterator<char const*, std::vector<char, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > > (__first= {_M_current = 0x7f13d1dd2ed0 "\fF.hdfsgop://7-7@100ce178526dbba4218c6f3dd86b7c04R"}, __last= {_M_current = 0x7f13d1dd2f28 "5"}, __result={_M_current = 0x0}) at /usr/include/c++/4.3/bits/stl_algobase.h:466#18 0x0000000000435e37 in std::vector<char, std::allocator<char> >::operator= (this=0x7f136a763cc0, __x=@0x7f13483852c8) at /usr/include/c++/4.3/bits/vector.tcc:163#19 0x0000000000586a52 in taf::ResponsePacket::operator= (this=0x7f136a763cb0) at ../../include/jce/RequestF.h:114
(gdb) frame 18#18 0x0000000000435e37 in std::vector<char, std::allocator<char> >::operator= (this=0x7f136a763cc0, __x=@0x7f13483852c8) at /usr/include/c++/4.3/bits/vector.tcc:163163 std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),[b]//走到这里,很奇怪[/b](gdb) l158 this->_M_impl._M_start = __tmp;159 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;160 }161 else if (size() >= __xlen)162 {163 std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),164 end(), _M_get_Tp_allocator());165 }166 else167 {(gdb) l 145140141 template<typename _Tp, typename _Alloc>142 vector<_Tp, _Alloc>&143 vector<_Tp, _Alloc>::144 operator=(const vector<_Tp, _Alloc>& __x)145 {146 if (&__x != this)147 {148 const size_type __xlen = __x.size();149 if (__xlen > capacity())(gdb) l150 {151 pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),152 __x.end());153 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,154 _M_get_Tp_allocator());155 _M_deallocate(this->_M_impl._M_start,156 this->_M_impl._M_end_of_storage157 - this->_M_impl._M_start);158 this->_M_impl._M_start = __tmp;159 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;(gdb) l160 }161 else if (size() >= __xlen)162 {163 std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),164 end(), _M_get_Tp_allocator());165 }166 else167 {168 std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),169 this->_M_impl._M_start);(gdb) l170 std::__uninitialized_copy_a(__x._M_impl._M_start + size(),171 __x._M_impl._M_finish,172 this->_M_impl._M_finish,173 _M_get_Tp_allocator());174 }175 this->_M_impl._M_finish = this->_M_impl._M_start + __xlen;176 }177 return *this;178 }179(gdb) p __x$117 = (const std::vector<char, std::allocator<char> > &) @0x7f13483852c8: {<std::_Vector_base<char, std::allocator<char> >> = { _M_impl = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_start = 0x7f13d1dd2ed0 "\fF.hdfsgop://7-7@100ce178526dbba4218c6f3dd86b7c04R", _M_finish = 0x7f13d1dd2f28 "5", _M_end_of_storage = 0x7f13d1dd2f28 "5"}}, <No data fields>}(gdb) p __xlen$118 = 0 [b]//主要是这里。明明__x里有内容,size怎么会变成了0呢?[/b](gdb) p *this$119 = {<std::_Vector_base<char, std::allocator<char> >> = { _M_impl = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}