处理连接对象时出现分段错误

Segmentation fault when dealing with connection object

本文关键字:分段 错误 连接 对象 处理      更新时间:2023-10-16

我有很多方法:

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;
   }
}

当调用disconnect或类析构函数时,会导致分段故障。(当我在下面注释掉断开连接的部分时,它发生在调用析构函数时。)

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

带disconnect()的gdb调用:

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)

很难说没有看到PGConnection的构造函数。特别是,构造函数应该始终设置conn=NULL

我还建议目前显示的行

    if ( conn->is_open()) {

应该是

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

我强烈怀疑您的conn成员没有正确初始化。

更好的方法是重新设计类,以便尽可能完全消除newdelete的使用。如果你这样做,这将是解决问题的更好方法。除非PGConnection即将连接到某个东西,否则它不太可能存在,因此构造函数也可以包含实例化pqxx::connection的代码。