Ошибка сегментации при работе с объектом подключения

У меня есть множество методов:

bool PGConnection::connect() {
 try
 {
 conn = new pqxx::connection(
 "user=temp "
 "host=xxxx "
 "password=xx "
 "dbname=temp");
 }
 catch (const std::exception &e)
 {
 std::cerr << e.what() << std::endl;
 return false;
 }
 return true;
}

//Disconnect from db
bool PGConnection::disconnect() {
 if ( conn->is_open()) {
 std::cout<<"try disconnect"<<std::endl; conn-="">disconnect();
 return true;
 }
 return false;
}

PGConnection::~PGConnection() {
 if ( conn != NULL) {
 delete conn;
 }
}
</std::endl;>

Когда вызывается разъединение или деструктор класса, это приводит к сбою segmantation. (Когда я прокомментирую, отключить часть ниже, это происходит, когда вызывается деструктор.)

int main () {
 PGConnection pgConn("xxx","xxx");
 pgConn.connect();
 pgConn.disconnect();
 return 0;
 }

gdb с вызовом disconnect():

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ba4852 in pqxx::connection_base::is_open() const () from /usr/lib/libpqxx-3.1.so
(gdb) bt
#0 0x00007ffff7ba4852 in pqxx::connection_base::is_open() const () from /usr/lib/libpqxx-3.1.so
#1 0x00000000004019d3 in PGConnection::disconnect (this=0x7fffffffe600) at pgconnection.cpp:42
#2 0x000000000040269e in main () at main.cpp:8
(gdb) frame 2
#2 0x000000000040269e in main () at main.cpp:8
8 pgConn.disconnect();
(gdb) print pgConn
$1 = {conn = 0x3}

gdb с отключением вызова:

(gdb) bt
#0 0x00007ffff7ba5fdb in pqxx::connection_base::close() () from /usr/lib/libpqxx-3.1.so
#1 0x0000000000401d3e in pqxx::basic_connection<pqxx::connect_direct>::~basic_connection (this=0x3,
 __in_chrg=<optimized out="">) at /usr/include/pqxx/basic_connection.hxx:74
#2 0x0000000000401a3d in PGConnection::~PGConnection (this=0x7fffffffe600, __in_chrg=<optimized out="">)
 at pgconnection.cpp:57
#3 0x00000000004026a3 in main () at main.cpp:11
(gdb) frame 2
#2 0x0000000000401a3d in PGConnection::~PGConnection (this=0x7fffffffe600, __in_chrg=<optimized out="">)
 at pgconnection.cpp:57
57 delete conn;
(gdb) print conn
$1 = (pqxx::connection *) 0x3
(gdb)
</optimized></optimized></optimized></pqxx::connect_direct>
1 ответ

Трудно сказать, не видя конструктора для PGConnection. В частности, конструктор должен всегда устанавливать conn=NULL.

Я также рекомендую, чтобы строка, которая в настоящее время говорит

if ( conn->is_open()) {

Вместо этого

if (conn && conn->is_open()) {

Я сильно подозреваю, что ваш conn не был правильно инициализирован.

Лучше всего было бы перепроектировать класс, чтобы исключить использование new и delete полностью, если сможете. Если вы это сделаете, это будет гораздо лучший способ решить проблему. Там вряд ли будет много причин для существования PGConnection если он не собирается подключиться к чему-то, поэтому конструктор может также содержать код для создания экземпляра pqxx::connection.

licensed under cc by-sa 3.0 with attribution.