我在一个与MySQL数据库建立连接的大项目中有这个代码,但是不起作用:
boost::shared_ptr<sql::Connection> connection;
sql::Driver *driver = get_driver_instance();
assert(driver != 0);
std::string server = "servname", user = "pietro", password = "abc";
try
{
connection.reset(driver->connect(server, user, password));
assert(connection != 0);
if(connection->isClosed() == false) // <-- segmentation fault
{
}
}
我指出了一个分段错误(所有参数都有效) 但是,这个相同的代码适用于测试项目。
使用调试器进入sql::Connection::isClosed()
成员函数,我没有获得有关可能原因的信息;这是我得到的地方:
mysql-connector-c ++ - 1.0.5 / driver / mysql_connection.cpp - 第430行
/* {{{ MySQL_Connection::checkClosed() -I- */
void
MySQL_Connection::checkClosed()
{
CPP_ENTER_WL(intern->logger, "MySQL_Connection::checkClosed");
if (!intern->is_valid) {
throw sql::SQLException("Connection has been closed");
}
}
此checkClosed()
函数从之前的connection.reset()
成功执行了七次。 “intern
”指针的值不会更改,在此阶段不为null。
当我检查连接是否关闭时,再次运行checkClosed()
功能。现在“intern
”指针值为0x8,这是我无法访问的位置。
我在这里得到SIGSEGV
分段错误。
如果您想要反汇编的代码,请告诉我......
平台:
MySQL 5.x
MySQL Connector / C ++ 1.0.5
Linux - OpenSuse 11.4
P.S .:
我注意到所有shared_ptr
的成员函数都按预期工作:
connection.get(); // = 0x8fb4a0
connection.use_count(); // = 1
connection.unique(); // = 1
而在指向对象上完成的所有调用都会导致分段错误(SIGABRT):
connection->getClientInfo();
connection->isClosed();
答案 0 :(得分:0)
您的连接已删除,或者您的内存已损坏。使用valgrind找到答案