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;
}
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)
heh。我是怎麼錯過的。太棒了!我沒有在構造函數中將它賦值爲NULL。 – yet