Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
string试图释放错误的内存 我在Linux环境中使用C++项目(MySQL +库)(V3.1.0)编译,并将一个Sql对象作为一个类成员( Session x DATA >),我已经制作了一个类(会话< /COD>)。一切正常,直到我的类的一个实例被销毁,这时一个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_C++_Linux_Gcc_Stdstring_Mysql++ - Fatal编程技术网

string试图释放错误的内存 我在Linux环境中使用C++项目(MySQL +库)(V3.1.0)编译,并将一个Sql对象作为一个类成员( Session x DATA >),我已经制作了一个类(会话< /COD>)。一切正常,直到我的类的一个实例被销毁,这时一个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

string试图释放错误的内存 我在Linux环境中使用C++项目(MySQL +库)(V3.1.0)编译,并将一个Sql对象作为一个类成员( Session x DATA >),我已经制作了一个类(会话< /COD>)。一切正常,直到我的类的一个实例被销毁,这时一个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,c++,linux,gcc,stdstring,mysql++,C++,Linux,Gcc,Stdstring,Mysql++,类Session通过以下方式填充Session\u数据的值: mysqlpp::StoreQueryResult res=query.store(); session=res[0]; (使用session\u data session作为类成员,以及query一个mysql++查询对象,该对象确实具有来自数据库的数据) 有时session可能会通过行session=tmp更改其值(其中tmp是另一个会话\u数据对象)。在所有其他情况下,会话中的变量都是按值使用的,例如在会话.account中,

Session
通过以下方式填充
Session\u数据的值:

mysqlpp::StoreQueryResult res=query.store();
session=res[0];
(使用
session\u data session
作为类成员,以及
query
一个mysql++查询对象,该对象确实具有来自数据库的数据)
有时
session
可能会通过行
session=tmp更改其值(其中tmp是另一个会话\u数据对象)。在所有其他情况下,
会话
中的变量都是按值使用的,例如在
会话.account
中,因此我认为它们不应该引起问题。希望这能给人们带来更多帮助。

我的心理调试技能告诉我,您的
会话
对象被双重删除,或者它没有正确实现-(0、3、5)规则,并且它的一个成员被双重删除(很可能是在被浅层复制或分配之后)。

我的问题是,我不知道哪种代码是最好的。我的整个项目太大了,不能放在这里,但正如问题所说,到目前为止,任何较小的版本都不会产生相同的错误。对不起,我并不是不想帮忙。我假设
malloc\u printerr
和/或
\u libc\u message
打印某种错误消息-是这样吗?是的,它们当时似乎打印程序的整个内存映射,主要涉及加载的库。实际上似乎只有很少一部分与所使用的变量有关。查看
session\u data
session
的代码可能会有所帮助,从中可以看到构造函数、析构函数和操纵器(如果它们是大类的话)。好吧,我似乎唯一做的事情就是用完全相同的代码重新编译,我很高兴地说,这个错误现在已经消失了。我会密切关注这个计划,如果它再次启动,我仍然无法解决,我会回到这里。谢谢你在这方面的帮助。拿出勇气来!您是对的,我没有为
会话
实现我自己的析构函数,尽管我不认为这是必要的,因为我没有使用任何需要特殊处理的指针。但我很高兴被告知我错了。@user2649502:这将是“0的规则”案例。如果所有资源都由成员和基类充分管理,则不需要析构函数或任何其他特殊的成员函数。
mysqlpp::StoreQueryResult res=query.store();
session=res[0];