微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std::vector::push_back() 崩溃

如何解决std::vector::push_back() 崩溃

所有,

出于某种原因,我在 std::vector 中执行 push_back 时崩溃了。

以下是回溯和最后执行的行:

(gdb) s std::vector<DataEditFiield,std::allocator<DataEditFiield> >::push_back (this=0x7fffd6ffc9b0,__x=...)
    at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/stl_vector.h:954
954       { emplace_back(std::move(__x)); }
(gdb) fin Run till exit from #0  std::vector<DataEditFiield,__x=...)
    at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/stl_vector.h:954

Thread 11 "dbhandler" received signal SIGSEGV,Segmentation fault.
0x00007ffff541bea0 in __memcpy_ssse3 () from /lib64/libc.so.6 (gdb) bt
#0  0x00007ffff541bea0 in __memcpy_ssse3 () from /lib64/libc.so.6
#1  0x00007ffff5f90943 in std::__cxx11::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>
>::_M_assign(std::__cxx11::basic_string<wchar_t,std::allocator<wchar_t> > const&) () from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libstdc++.so.6
#2  0x00007ffff5f90cc9 in std::__cxx11::basic_string<wchar_t,std::allocator<wchar_t>
>::operator=(std::__cxx11::basic_string<wchar_t,std::allocator<wchar_t> > const&) () from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libstdc++.so.6
#3  0x00007fffe30ebdd5 in DataEditFiield::ValuueType::ValuueType (this=0x7fffcc001420,myvalue=...) at ../../dbinterface/database.h:53
#4  0x00007fffe30f9b79 in DataEditFiield::DataEditFiield (this=0x7fffcc001410) at ../../dbinterface/database.h:40
#5  0x00007fffe30f9bc8 in __gnu_cxx::new_allocator<DataEditFiield>::construct<DataEditFiield,DataEditFiield> (this=0x7fffd6ffc9b0,__p=0x7fffcc001410,__args#0=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/ext/new_allocator.h:136
#6  0x00007fffe30f7042 in std::allocator_traits<std::allocator<DataEditFiield>
>::construct<DataEditFiield,DataEditFiield> (__a=...,__args#0=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/alloc_traits.h:475
#7  0x00007fffe30f7157 in std::vector<DataEditFiield,std::allocator<DataEditFiield> >::_M_realloc_insert<DataEditFiield>
(this=0x7fffd6ffc9b0,__position=...,__args#0=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/vector.tcc:415
#8  0x00007fffe30f3b76 in std::vector<DataEditFiield,std::allocator<DataEditFiield> >::emplace_back<DataEditFiield>
(this=0x7fffd6ffc9b0,__args#0=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/vector.tcc:105
#9  0x00007fffe30f04d6 in std::vector<DataEditFiield,__x=...)
    at /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include/g++-v7/bits/stl_vector.h:954
#10 0x00007fffe30eb44c in sqliteDatabase::EditTableData (this=0x555555e918f0,row=...,errorMsg=...)
    at /home/igor/dbhandler/libsqlite/database_sqlite.cpp:2044
#11 0x00007fffd5eb60ba in DBTableEdit::Entry (this=0x555555880110) at /home/igor/dbhandler/libtabledataedit/dbtableedit.cpp:48
#12 0x00007ffff63b6bb5 in wxThread::CallEntry (this=0x555555880110) at ../include/wx/thrimpl.cpp:356
#13 0x00007ffff63b11a1 in wxThreadInternal::PthreadStart (thread=0x555555880110) at ../src/unix/threadpsx.cpp:891
#14 0x00007ffff63b0c31 in wxPthreadStart (ptr=0x555555880110) at ../src/unix/threadpsx.cpp:841
#15 0x00007ffff56a3aba in start_thread () from /lib64/libpthread.so.0
#16 0x00007ffff53d870f in clone () from /lib64/libc.so.6

有什么问题?我需要实施一些东西吗?

STL 代码不应崩溃...

TIA!!

我正在使用的代码

struct DataEditFiield
{
    int type,m_size,m_precision;
    union ValuueType
    {
        void *blobValue;
        int intValue;
        double doubleValue;
        std::wstring stringValue;
        ValuueType(int value) : intValue( value ) {}
        ValuueType(double value) : doubleValue( value ) {}
        ValuueType(std::wstring value) : stringValue( value ) {}
        ValuueType(const void *value) : blobValue( const_cast<void *>( value ) ) {}
        ValuueType(const ValuueType &myvalue) { stringValue = myvalue.stringValue; }
#if defined _MSC_VER
        __int64 longvalue;
        ValuueType(__int64 value) : longvalue( value ) {}
#else
        long long int longvalue;
        ValuueType(long long int value) : longvalue( value ) {}
#endif
        ~ValuueType() noexcept {}
    } value;

    DataEditFiield(int myvalue) : type( INTEGER_TYPE ),m_size( 0 ),m_precision( 0 ),value( myvalue ) { }

    DataEditFiield(double myvalue,int size,int precision) : type( DOUBLE_TYPE ),m_size( size ),m_precision( precision ),value( myvalue ) { }

    DataEditFiield(std::wstring myvalue) : type( STRING_TYPE ),value( myvalue ) {}

    DataEditFiield(const void *myvalue) : type( BLOB_TYPE ),value( myvalue ) {}

#if defined _MSC_VER
    DataEditFiield(__int64 myvalue) : type( INTEGER_TYPE ),value( myvalue ) {}
#else
    DataEditFiield(long long int myvalue) : type( 1 ),value( myvalue ) {}
#endif
    ~DataEditFiield()
    {
        using std::wstring;
        if( type ==3 )
            value.stringValue.~wstring();
    }
};

std::vector<DataEditFiield> row;
row..push_back( DataEditFiield( sqlite3_column_int64( m_stmt,i ) ) );

解决方法

致所有感兴趣的人:

解决方案是向 DataEditFiield 添加一个复制构造函数。

显然 union 不会产生工作默认的。如果编译器直接删除它并警告它会很好,但我想它太麻烦了。

感谢所有感兴趣的人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。