c - update - sqlite tutorial
sqlite3_column_text zurückgegebene Daten werden beim Finalisieren/Schließen beschädigt (1)
Aus dem feinen Handbuch :
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
[...]
Die zurückgegebenen Zeiger sind gültig, bis eine Typumwandlung wie oben beschrieben erfolgt oder bissqlite3_step()
odersqlite3_reset()
odersqlite3_finalize()
aufgerufen wird.
Sobald Sie also sqlite3_finalize
, werden die Rückgabewerte von sqlite3_column_text
ungültig und Ihre Zeiger myLocation1
und myLocation2
verweisen auf den myLocation1
.
Wenn Sie diese Zeichenfolgen nach dem Aufruf von sqlite3_finalize
benötigen, müssen Sie sie in den von Ihnen kontrollierten Speicher kopieren. In der Tat, aufgrund der sind gültig, bis eine Typumwandlung auftritt beachten Sie, sollten Sie sie sofort kopieren und nur verwenden (char*)sqlite3_column_text(stmt, 0);
während du deine eigenen Kopien machst.
Ich bin mir nicht sicher, was hier passiert, aber ich stelle fest, dass die zurückgegebenen Daten von sqlite3_column_text während der finalize / close sqlite Phase geändert werden.
// rc not handled in this abbreviated code
sqlite3 *db;
sqlite3_stmt *stmt;
char * sql;
const char * tail;
int rc;
char * dbName = "C:\\db\\myblobs.db";
int myIndex = 0;
char * myLocation1;
string myLocation2;
rc = sqlite3_open(dbName, &db);
sql = "SELECT location FROM blobs WHERE key = ?";
rc = sqlite3_prepare(db, sql, strlen(sql), &stmt, &tail);
sqlite3_bind_int(stmt, 1, myIndex);
rc = sqlite3_step(stmt);
myLocation1 = (char*)sqlite3_column_text(stmt, 0);
myLocation2 = (char*)sqlite3_column_text(stmt, 0);
// can process myLocation1 & myLocation2 fine here
sqlite3_finalize(stmt); // data myLocation1 points to get corrupted
sqlite3_close(db); // data myLocation2 points to gets further corrupted
Das Problem ist in Bezug auf myLocation1. Die Daten, auf die es zeigt, sind in Ordnung, bis es die Anweisungen sqlite3_finalize und sqlite3_close trifft. Myllocation2 bleibt jedoch unverändert. Also nicht sicher, was hier passiert. Nach dem Ausführen von sqlite3_close (db) wird myLocation1 in Visual Studio 2010 als "Bad Ptr" identifiziert.
Jede Hilfe, die am meisten geschätzt wird.