我不确定这里发生了什么,但我发现在finalize/close sqlite阶段,sqlite3_column_text返回的数据正在被更改.
// 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
Run Code Online (Sandbox Code Playgroud)
问题与myLocation1有关.它指向的数据很好,直到它到达sqlite3_finalize和sqlite3_close语句.然而,mylocation2保持不变.所以不确定这里发生了什么.执行sqlite3_close(db)后,myLocation1在Visual Studio 2010中被标识为"Bad Ptr".
任何帮助最受赞赏.
从精细手册:
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
[...]
,直到如上所述发生类型转换,或直到返回的指针是有效sqlite3_step()或sqlite3_reset()或sqlite3_finalize()被调用.
因此,只要您调用sqlite3_finalize,返回值sqlite3_column_text就会变为无效,而您myLocation1和myLocation2指针指向垃圾.
如果您在打电话后需要这些字符串,sqlite3_finalize则必须将它们复制到您控制的内存中.实际上,由于在类型转换发生之前有效,因此您应该立即复制它们,并且仅(char*)sqlite3_column_text(stmt, 0);在您制作自己的副本时使用.
| 归档时间: |
|
| 查看次数: |
10260 次 |
| 最近记录: |