У меня есть этот код в большом проекте, который устанавливает соединение с базой данных 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
msgstr «указатель не изменяется и не является нулевым на данном этапе.
Когда я проверяю, закрыто ли соединение, checkClosed()
функция запускается снова. Теперь «intern
msgstr «значение указателя 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();
либо ваше соединение удалено, либо у вас повреждена память. используйте valgrind, чтобы найти ответ
Других решений пока нет …