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 bis sqlite3_step() oder sqlite3_reset() oder sqlite3_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.