gpt4 book ai didi

c - sqlite3_bind_blob 什么时候释放内存是安全的?

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:07 25 4
gpt4 key购买 nike

我有这样的工作代码:

const char sql[] = "INSERT INTO test (pk, geom) VALUES (?, ?)";
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (handle, sql, strlen (sql), &stmt, NULL);

for (...) {
sqlite3_reset (stmt);
sqlite3_clear_bindings (stmt);
int blob_size = ..;
unsigned char *blob = malloc(blob_size);
sqlite3_bind_int64 (stmt, 1, pk);
sqlite3_bind_blob (stmt, 2, blob, blob_size, free);
sqlite3_step (stmt);
}

我想知道是否可以在循环的每一步都不分配和释放?如果我将 SQLITE_STATIC 而不是 free 传递给 sqlite3_bind_blob并在循环结束后调用 free 此代码是否仍然有效?

const char sql[] = "INSERT INTO test (pk, geom) VALUES (?, ?)";
sqlite3_stmt *stmt;
sqlite3_prepare_v2 (handle, sql, strlen (sql), &stmt, NULL);
int capacity = 1024;
unsigned char *blob = malloc(capacity);

for (...) {
sqlite3_reset (stmt);
sqlite3_clear_bindings (stmt);
int blob_size = ..;
if (capacity < blob_size) {
blob = realloc(blob, blob_size);
capacity = blob_size;
}
sqlite3_bind_int64 (stmt, 1, pk);
sqlite3_bind_blob (stmt, 2, blob, blob_size, SQLITE_STATIC);
sqlite3_step (stmt);
}
free(blob);

最佳答案

使用 SQLITE_STATIC 要求该值在语句可能访问它时保持有效。

您的代码应该是有效的;但可以肯定的是,将对 sqlite3_clear_bindings() 的调用(以及重置)移动到循环的末尾。

关于c - sqlite3_bind_blob 什么时候释放内存是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48138521/

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