我在Linux环境中的C ++项目(使用GCC 4.8.1编译)中使用mysql ++库(v3.1.0),并将ssqls对象作为类成员(session_data
)我上过课(Session
)。一切正常,直到我的类的一个实例被破坏,此时std::string
对象似乎试图释放它没有的内存,导致内核介入。下面是堆栈的一部分失败后由GDB给出的跟踪。
#2 0x00c143ea in abort () from /lib/libc.so.6
#3 0x00c529d5 in __libc_message () from /lib/libc.so.6
#4 0x00c58e31 in malloc_printerr () from /lib/libc.so.6
#5 0x00c5b571 in _int_free () from /lib/libc.so.6
#6 0x0810e43f in operator delete(void*) () at ../../../../gcc-4.8.1/libstdc++-v3/libsupc++/del_op.cc:47
#7 0x081518eb in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::allocator<char> const&) ()
at /include/ext/new_allocator.h:110
#8 0x08151930 in std::string::_Rep::_M_dispose ()
at /include/bits/basic_string.h:249
#9 0x0815199e in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() ()
at /include/bits/basic_string.h:539
#10 0x080ac492 in session_data::~session_data() ()
at sql_tables.h:80
#11 0x080ac537 in Session::~Session() ()
at session.cpp:5
所有这些析构函数似乎都是在运行中创建的,因为我无法在其中设置断点,因为它们根据GDB不存在。就个人而言,我怀疑这是GCC产生的代码中的一个错误,这让我假设我以某种方式“错误地”处理了ssqls对象。到目前为止,我在一个较小的项目中重现错误的努力失败了,但如果我管理它,我肯定会在这里发布该代码。 我真的想知道是否有人知道ssqls对象内部可能导致这种情况的原因,与此同时我将继续尝试调试该问题。
用最少的代码编辑。
session_data
完全由ssqls宏来完成,我称之为:
sql_create_7(session_data, 4,7, sql_varchar, id,
sql_text, last_ip,
sql_text, last_user_agent,
sql_datetime, expires,
sql_text, account,
sql_text, messages,
sql_text, login_key)
班级Session
通过以下方式填充session_data
的值
mysqlpp::StoreQueryResult res=query.store();
session=res[0];
(session_data session
是类成员,query
是一个mysql ++查询对象,它有数据库中的数据)
有时,session
的值可能会被行session=tmp;
更改(其中tmp是另一个session_data对象)。在所有其他情况下,session
中的变量由值使用,例如在session.account
中,因此我认为它们不应该导致问题。希望这会对人们有所帮助。
答案 0 :(得分:1)
我的通灵调试技巧告诉我你的Session
对象被双重删除,或者它没有正确实现规则 - (0,3,5)并且其中一个成员得到了双重删除(很可能是在浅层复制或分配后)。