【发布时间】:2011-05-18 09:51:14
【问题描述】:
我正在使用 qt 4.5.3 访问 sqlite 数据库,如下所示:
class db : private boost::noncopyable
{
public:
db( QString file ) : filename( file ),
realdb( NULL ),
theConnectionEstablished( false )
{
}
~db()
{
if ( NULL != realdb.get() )
{
realdb.reset( NULL );
}
if ( theConnectionEstablished )
{
QSqlDatabase::removeDatabase( "ConnName" );
}
}
void open()
{
realdb.reset( new QSqlDatabase( QSqlDatabase::addDatabase( "QSQLITE", "ConnName" ) ) );
theConnectionEstablished = true;
// open the db
realdb->setDatabaseName( filename );
if ( ! realdb->open() )
{
const QSqlError dbError = realdb->lastError();
const QString errorDesc = "Error opening the database : " + filename +
"\nDatabase error : " + dbError.databaseText() +
"\nDatabase driver error : " + dbError.driverText();
// DatabaseError is a class type which accepts the std::string for logging purposes
throw DatabaseError( errorDesc.toStdString() );
}
}
const QString filename;
std::auto_ptr<QSqlDatabase> realdb;
bool theConnectionEstablished;
};
现在,如果我尝试像这样测试这个案例(我正在使用 cxxtest):
void test_failed_connection()
{
db obj( "/" );
TS_ASSERT_THROWS( obj.open(), DatabaseError );
}
我收到 valgrind 报告的内存泄漏:
<error>
<unique>0x5b</unique>
<tid>1</tid>
<kind>Leak_DefinitelyLost</kind>
<what>986 (384 direct, 602 indirect) bytes in 1 blocks are definitely lost in loss record 23 of 23</what>
<leakedbytes>986</leakedbytes>
<leakedblocks>1</leakedblocks>
<stack>
<frame>
<ip>0x4006D3E</ip>
<obj>/opt/valgrind341/lib/valgrind/x86-linux/vgpreload_memcheck.so</obj>
<fn>malloc</fn>
<dir>/home/slawomir/valgrind-3.4.1/build/valgrind-3.4.1/coregrind/m_replacemalloc</dir>
<file>vg_replace_malloc.c</file>
<line>207</line>
</frame>
<frame>
<ip>0x67FADC4</ip>
<obj>/usr/lib/libsqlite3.so.0.8.6</obj>
<fn>sqlite3_malloc</fn>
</frame>
<frame>
<ip>0x67FAF13</ip>
<obj>/usr/lib/libsqlite3.so.0.8.6</obj>
</frame>
<frame>
<ip>0x6816DA3</ip>
<obj>/usr/lib/libsqlite3.so.0.8.6</obj>
</frame>
<frame>
<ip>0x68175FD</ip>
<obj>/usr/lib/libsqlite3.so.0.8.6</obj>
<fn>sqlite3_open16</fn>
</frame>
<frame>
<ip>0x40DDEF9</ip>
<obj>/usr/lib/qt4/plugins/sqldrivers/libqsqlite.so</obj>
</frame>
<frame>
<ip>0x7F34AE0</ip>
<obj>/usr/lib/libQtSql.so.4.5.2</obj>
<fn>QSqlDatabase::open()</fn>
</frame>
</frame>
</stack>
</error>
有人知道如何解决这个漏洞吗?
【问题讨论】:
-
@DumbCode 我没有尝试优化任何东西,但我正在尝试对我的代码进行单元测试。问题是在打开数据库出现问题时如何测试案例。正如您在示例中看到的,我将“/”(根目录)作为数据库名称传递以模拟这种情况。
标签: c++ linux qt sqlite valgrind