gpt4 book ai didi

c - sqlite3_column_text 返回的数据在完成/关闭期间被损坏

转载 作者:IT王子 更新时间:2023-10-29 06:25:41 25 4
gpt4 key购买 nike

我不确定这里发生了什么,但我发现从 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 语句之前都很好。但是 mylocation2 保持不变。所以不确定这里发生了什么。执行 sqlite3_close(db) 后,myLocation1 在 Visual Studio 2010 中被识别为“Bad Ptr”。

非常感谢任何帮助。

最佳答案

来自fine manual :

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
[...]
The pointers returned are valid until a type conversion occurs as described above, or until sqlite3_step() or sqlite3_reset() or sqlite3_finalize() is called.

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

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

关于c - sqlite3_column_text 返回的数据在完成/关闭期间被损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com