ich qt 4.5.3 bin mit der SQLite-Datenbank zugreifen zu können, wie folgt aus:Datenbank öffnen in ungültige Stelle verursacht Speicherverlust
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;
};
Nun, wenn ich versuchen, diesen Fall wie diesem zu testen (ich benutze CxxTest) :
void test_failed_connection()
{
db obj("/");
TS_ASSERT_THROWS(obj.open(), DatabaseError);
}
ich ein Speicherleck von valgrind gemeldet bekommen:
<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>
Wer weiß, wie dieses Leck zu beheben?
@DumbCode Ich versuche nicht, irgendetwas zu optimieren, aber ich versuche meinen Code zu testen. Das Problem besteht darin, den Fall zu testen, wenn beim Öffnen der Datenbank ein Problem aufgetreten ist. Wie Sie im Beispiel sehen können, übergebe ich "/" (das Stammverzeichnis) als Datenbanknamen, um diesen Fall zu emulieren. –