c-sqlite3_column_text返回的数据在完成/关闭过程中损坏



我不确定这里发生了什么,但我发现sqlite3_column_text返回的数据在finalize/close-sqlite阶段发生了更改。

  // 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

问题与myLocation1有关。它所指向的数据在到达sqlite3_finalize和sqlite3_close语句之前都很好。然而,我的位置2保持不变。所以不确定这里发生了什么。在执行sqlite3_close(db)之后,myLocation1在VisualStudio2010中被标识为"Bad Ptr"。

任何帮助,不胜感激。

来自精细手册:

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
[…]
返回的指针有效,直到如上所述发生类型转换,或者直到调用sqlite3_step()sqlite3_reset()sqlite3_finalize()

因此,一旦调用sqlite3_finalizesqlite3_column_text的返回值就会变为无效,并且myLocation1myLocation2指针指向垃圾。

如果在调用sqlite3_finalize之后需要这些字符串,则必须将它们复制到您控制的内存中。事实上,由于在发生类型转换之前是有效的注意,您应该立即复制它们,并且在制作自己的副本时只使用(char*)sqlite3_column_text(stmt, 0);

最新更新