我在 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
都是按值使用的,例如 in session.account
,所以我认为它们不应该引起问题。希望这对人们有更多帮助。