0

我在一个与 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();
4

1 回答 1

0

要么你的连接被删除,要么你有内存损坏。使用 valgrind 寻找答案

于 2013-02-19T23:34:50.127 回答