2013-05-22 1 views
0

내 바이너리가 충돌합니다. 코어 덤프를 실행, 나는 다음을 발견 :내 바이너리가 충돌하는 STL 벡터의 대규모 삭제

#0 0x00a6a363 in memmove() from /lib/tls/libc.so.6 
(gdb) frame 1 
#1 0x083a108c in std::__copy_trivial<piola::piolaOrderBook*> (__first=0xb277f2c4, __last=0xb277f2bc, __result=0xb277f2c0) 
    at /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:258 
258   std::memmove(__result, __first, sizeof(_Tp) * (__last - __first)); 
(gdb) frame 2 
#2 0x083a0ad6 in std::__copy_aux2<piola::piolaOrderBook*> (__first=0xb277f2c4, __last=0xb277f2bc, __result=0xb277f2c0) 
    at /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:279 
279   { return std::__copy_trivial(__first, __last, __result); } 
(gdb) frame 3 
#3 0x083a02d1 in std::__copy_ni2<piola::piolaOrderBook**, __gnu_cxx::__normal_iterator<piola::piolaOrderBook**, std::vector<piola::piolaOrderBook*, std::allocator<emapi::EmapiOrderBook*> > > > (__first=0xb277f2c4, __last=0xb277f2bc, __result= 
     {_M_current = 0xb277f2c0}) 
    at /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:296 
296   return _OutputIterator(std::__copy_aux2(__first, __last, __result.base(), 
(gdb) frame 4 
#4 0x0839f1b0 in std::__copy_ni1<__gnu_cxx::__normal_iterator<piola::piolaOrderBook**, std::vector<piola::piolaOrderBook*, std::allocator<piola::piolaOrderBook*> > >, __gnu_cxx::__normal_iterator<piola::piolaOrderBook**, std::vector<piola::piolaOrderBook*, std::allocator<piola::piolaOrderBook*> > > > (__first={_M_current = 0xb277f2c4}, __last= 
     {_M_current = 0xb277f2bc}, __result={_M_current = 0xb277f2c0}) 
    at /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:317 
317   return std::__copy_ni2(__first.base(), __last.base(), 
(gdb) frame 5 
#5 0x0839d676 in std::copy<__gnu_cxx::__normal_iterator<piola::piolaOrderBook**, std::vector<piola::piolaOrderBook*, std::allocator<piola::piolaOrderBook*> > >, __gnu_cxx::__normal_iterator<piola::piolaOrderBook**, std::vector<piola::piolaOrderBook*, std::allocator<piola::piolaOrderBook*> > > > (__first={_M_current = 0xb277f2c4}, __last={_M_current = 0xb277f2bc}, 
    __result={_M_current = 0xb277f2c0}) 
    at /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:358 
358   return std::__copy_ni1(__first, __last, __result, __Normal()); 
(gdb) 

이 대부분 삭제하기 때문에 (그러나 그것은 벡터에서 삭제를 처리 할 수 ​​있기 때문에 코드가 추락 것 같다 memmove를을 찾고, 나에게 비밀입니다 벡터로부터 큰 벡터에 대한 연산은 매우 큼)?

맞습니까? 그렇다면 어떻게하면이 문제를 해결할 수 있습니까?

코드

은 여기에 있습니다 :

for (orderbkIterator = vOrderBook.begin(); orderbkIterator != vOrderBook.end(); orderbkIterator++) 
    { 

     if ( (*(*orderbkIterator)->getOrderBookId()) == *(TradableInst->getOrderBookId())) 
     { 
      long long a = (*(*orderbkIterator)->getOrderBookId()); 
      ADDVLOG(LOG_INFO, "Removing record (%lld) from vOrderBook", a); 
      vOrderBook.erase(orderbkIterator); 
     } 
+1

코드를 게시 할 수 있습니까? – hmjd

+0

@hmjd 여기 있습니다. – Chani

+0

* 실제 * 메모리 손상이이 작업 근처에서 어디에도 발생하지 않았습니다. 'valgrind'에서 프로그램을 실행하고보고 한 첫 번째 문제를 수정하십시오. 그것이 불평하지 않을 때까지 반복하십시오. – zwol

답변

2

:

반복기 및 소거 요소 및 그 용기의 단부들 사이의 요소에 대한 참조는 무효화된다. past-the-end 반복자도 무효화됩니다.

orderbkIteratorerase()이 호출되면 다음 증가 될 때 유효하지 않습니다. erase()가 제거 된 반복자 후 다음 반복자를 반환 같은 erase()이 발생하지 않은 경우에만 증가 즉, 루프의 구조를 변경 :

for (orderbkIterator = vOrderBook.begin(); orderbkIterator != vOrderBook.end();) 
{ 
    if (...) 
    { 
     orderbkIterator = vOrderBook.erase(orderbkIterator); 
    } 
    else 
    { 
     ++orderbkIterator; 
    } 
} 
1

나는

vOrderBook.erase(orderbkIterator); 

반복자를 무효화 것이라고 확신합니다. 증분을 계속하면 정의되지 않은 결과가 발생합니다. std::vector::erase() 가입일

+0

네, 맞습니다, 고마워요. – Chani

0

제거 삭제 관용구는 무효화 반복자와 함정의 대부분을 방지 할 수 있습니다.

vOrderBook.erase(
    std::remove_if(vOrderBook.begin(), vOrderBook.end(), <unary-predicate>), 
    vOrderBook.end()); 

단항 술어는 람다 또는 펑 될 수있다 : 다음과 같이 보일 것이 관용구를 사용하여 루프를 Rewritting

.

관련 문제