2014-04-12 48 views
0

打交道時,我的方法幫:分段故障與連接對象

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

當斷開或類的析構函數被調用時,它會導致segmantation故障。 (當我註釋掉斷開部分低於它發生的時候調用析構函數)。

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

gdb with disconnect() called

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 with out calling disconnect

(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) 

回答

2

很難說沒有看到的構造方法PGConnection。特別是,構造函數應該始終設置爲conn=NULL

我還建議,目前說

if (conn->is_open()) { 

該行應改爲

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

我強烈懷疑你conn成員沒有被正確初始化。

更好的做法是重新設計班級,這樣如果可以的話,您完全不需要使用newdelete。如果你這樣做,這將是解決問題的更好方法。 PGConnection不存在很多原因,除非它要連接到某個東西,所以構造函數還可以包含代碼以實例化一個pqxx::connection

+0

heh。我是怎麼錯過的。太棒了!我沒有在構造函數中將它賦值爲NULL。 – yet