C ++ cra sh со стеком, показывающим векторный деструктор при вызове конструктора - PullRequest
0 голосов
/ 23 марта 2020

Я немного запутался в следах нашей программы и буду очень рад любым подсказкам или предположениям о том, что может произойти. Мне кажется, что конструктор std::vector<details::AVP_key> в строке 59 выполнен неправильно (частично) и сразу же называется деструктором, который не работает. Я понятия не имею, почему в кадре обратной трассировки #9 я вижу деструктор вектора при обработке векторного конструктора.

Код

53  static Validation_result check_internal(const Command_entry &cmd, const 
              message::diameter::delegate_type &msg, const message::diameter::avp_list_t &msg_avps)
54  {
55      auto tmp = check_fixed_avps(cmd.get_fixed_avps(), msg_avps.begin(), msg_avps.end());
56      auto &optional_avps = cmd.get_optional_avps();
57      if(tmp.check_result)
58      {
59          std::vector<details::AVP_key> avp_keys(msg_avps.end() - tmp.pos); // substraction of iterators
60          ...

, где AVP_key равно

    using id_type = uint32_t;

    namespace details
    {
        struct AVP_key
        {
            id_type code;
            id_type vendor;

            bool operator==(const AVP_key &) const;
            bool operator<(const AVP_key &) const;
        };

Backtrace

Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `...some command...'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7fb4fb84b700 (LWP 31575))]

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007fb50046842a in __GI_abort () at abort.c:89
#2  0x00007fb5004a4c00 in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7fb500599fd0 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007fb5004aafc6 in malloc_printerr (action=3, str=0x7fb50059a048 "double free or corruption (!prev)", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5049
#4  0x00007fb5004ab80e in _int_free (av=0x7fb488000020, p=0x7fb3935fcef0, have_lock=0) at malloc.c:3905
#5  0x000055b837aef403 in __gnu_cxx::new_allocator<diameter::details::AVP_key>::deallocate (this=<synthetic pointer>, __p=0x7fb3935fcf00) at /usr/include/c++/6/ext/new_allocator.h:110
#6  std::allocator_traits<std::allocator<diameter::details::AVP_key> >::deallocate (__a=<synthetic pointer>..., __n=<optimized out>, __p=0x7fb3935fcf00) at /usr/include/c++/6/bits/alloc_traits.h:462
#7  std::_Vector_base<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::_M_deallocate (this=<synthetic pointer>, __n=<optimized out>, __p=0x7fb3935fcf00) at /usr/include/c++/6/bits/stl_vector.h:178
#8  std::_Vector_base<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::~_Vector_base (this=<synthetic pointer>, __in_chrg=<optimized out>) at /usr/include/c++/6/bits/stl_vector.h:160
#9  std::vector<diameter::details::AVP_key, std::allocator<diameter::details::AVP_key> >::~vector (this=<synthetic pointer>, __in_chrg=<optimized out>) at /usr/include/c++/6/bits/stl_vector.h:427
#10 diameter::check_internal (msg=std::unique_ptr<message::diameter::DiameterMessageWrapper> containing 0x12d, msg_avps=..., cmd=...) at /some_path/check.cpp:59
#11 diameter::check (dictionary=..., msg=std::unique_ptr<message::diameter::DiameterMessageWrapper> containing 0x7fb4a2a56e10, msg_avps=std::vector of length 18, capacity 32 = {...})
    at /some_path/check.cpp:116

Большое спасибо за помощь.

С уважением, Иржи

...