【发布时间】:2013-02-19 18:47:55
【问题描述】:
我在一个与 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
附:
我注意到shared_ptr 的所有成员函数都按预期工作:
connection.get(); // = 0x8fb4a0
connection.use_count(); // = 1
connection.unique(); // = 1
虽然对指向对象的所有调用都会导致分段错误(SIGABRT):
connection->getClientInfo();
connection->isClosed();
【问题讨论】:
-
在'intern'之前定义了哪个成员变量?错误一定在其他地方。您显示的代码不是问题。
-
在“实习生”之前我只能看到禁用的调试宏。我把我做的所有调试步骤都报告了,所以中间没有执行其他代码。
-
为什么要通过.运算符,并通过 -> 运算符 isClosed?这个问题是由于 shared_ptr 的一些时髦行为造成的,还是仅仅是这个问题中的一个错字?
-
您是否在整个程序中运行了
valgrind?可能存在与 MySQL 没有直接关系的内存泄漏(或溢出),只是触发了 MySQL 连接器中的 SIGSEGV... -
@James:因为
reset()是shared_ptr类的成员函数,而isClosed()是sql::Connection的成员函数,共享指针指向。
标签: c++ mysql linux segmentation-fault mysql-connector