SQLite : メモリ管理

SQLiteAPIのメモリ管理がどうなっているのか追っていた。
sqlite3_column_textで得られた文字列を使い終わった後に誰が解放するのか不明なため。
とりあえず、利用側で解放しておけばいいのか?

      • -

ソースを追いかけるのをやめて、テストプログラムを作って見た。

#include <stdio.h>
#include "sqlite3.h"

#define sql "SELECT i,r,t FROM tbl1"

int main (int argc, char **argv) {
  sqlite3 *conn;
  sqlite3_open("db", &conn);
  const char *tl;
  sqlite3_stmt *stmt;
  sqlite3_prepare(conn, sql, strlen(sql), &stmt, &tl);
  int ri[3];
  double rr[3];
  const char *rt[3];
  int i;
  for (i=0;i<3;++i){
    sqlite3_step(stmt);
    ri[i] = sqlite3_column_int(stmt, 0);
    rr[i] = sqlite3_column_double(stmt, 1);
    rt[i] = sqlite3_column_text(stmt, 2);
    printf("%d %f %s\n", ri[i], rr[i], rt[i]);
  }
  for (i=0;i<3;++i){
    printf("%d %f %s\n", ri[i], rr[i], rt[i]);
  }
  sqlite3_finalize(stmt);
  for (i=0;i<3;++i){
    printf("%d %f %s\n", ri[i], rr[i], rt[i]);
  }
  sqlite3_close(conn);
  for (i=0;i<3;++i){
    printf("%d %f %s\n", ri[i], rr[i], rt[i]);
  }
}

結果は

$ ./a.exe
1 1.100000 aaa
2 2.200000 bbb
3 3.300000 ccc
1 1.100000 ccc
2 2.200000 ccc
3 3.300000 ccc
1 1.100000 ccc
2 2.200000 ccc
3 3.300000 ccc
1 1.100000 ccc
2 2.200000 ccc
3 3.300000 ccc

解放は、SQLite側に任せてもよさそうです。その代わり、文字列はちゃんとコピーしておかないとダメです。
まあ、常識的です。