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()
直前から 7 回正常に実行されています。" " ポインターの値はintern
変更されず、この段階では null ではありません。
接続が閉じているかどうかを確認すると、checkClosed()
関数が再度実行されます。現在、" intern
" ポインターの値は 0x8 で、アクセスできない場所です。
ここでSIGSEGV
、セグメンテーション違反が発生します。
逆アセンブルされたコードが必要な場合はお知らせください...
プラットフォーム:
MySQL 5.x
MySQL コネクタ/C++ 1.0.5
Linux - OpenSuse 11.4
shared_ptr
PS: すべての のメンバー関数が期待どおりに機能 することに気付きました:
connection.get(); // = 0x8fb4a0
connection.use_count(); // = 1
connection.unique(); // = 1
ポイントされたオブジェクトに対して行われたすべての呼び出しは、セグメンテーション違反 (SIGABRT) を引き起こします。
connection->getClientInfo();
connection->isClosed();