我在一个与 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
”指针的值在这个阶段不会改变并且不为空。
当我检查连接是否关闭时,该checkClosed()
功能会再次运行。现在“ intern
”指针值是 0x8,我无法访问的位置。
在这里,我得到一个SIGSEGV
, 分段错误。
如果您想要反汇编代码,请告诉我...
平台:
MySQL 5.x
MySQL 连接器/C++ 1.0.5
Linux - OpenSuse 11.4
PS:我注意到所有shared_ptr
的成员函数都按预期工作:
connection.get(); // = 0x8fb4a0
connection.use_count(); // = 1
connection.unique(); // = 1
而对指向对象进行的所有调用都会导致分段错误(SIGABRT):
connection->getClientInfo();
connection->isClosed();