std::string试图释放错误的内存
std::string tries to free the wrong memory
我在linux环境中的C++项目(使用GCC 4.8.1编译)中使用mysql++库(v3.1.0),并有一个ssqls对象作为我创建的类(Session
)的类成员(session_data
)。一切都很好,直到我的类的一个实例被销毁,这时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
中,所以我认为它们不应该引起问题。希望这对人们有更多的帮助。
我的心理调试技能告诉我,您的Session
对象被双重删除,或者它没有正确实现-(0,3,5)规则,并且它的一个成员被双重删除(很可能是在被浅层复制或分配之后)。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 共享内存:MapViewOfFile 返回错误 5
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 释放动态内存时C++错误
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 复制内存给出分段错误
- C++程序错误:malloc():内存损坏
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 为什么删除分配的阵列会导致内存错误?
- 需要找到3个小错误-内存错误
- 错误:内存位置的 std::length_error
- 修复了瓦尔格林德错误内存泄漏的错误
- 错误:“内存集”未在此范围内声明
- OpenCV 2.4.5运行时错误内存
- OpenCV错误:内存不足
- STL映射,设置错误:内存超出分配块的末尾
- GLUT:致命错误:内存不足
- MPI错误:内存不足-有哪些解决方案选项