3

C ++で関数を使用してsqlite3を初期化すると、関数から出るとハンドルがNullになります。何がこれを引き起こす可能性がありますか?ポインターをパラメーターとして渡すだけです。open を main 関数に移動すると、正常に動作します。これを引き起こす原因は何ですか?何かが隠され、範囲外になっていますか?

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

using namespace std;

int init_table(sqlite3 *dbH,  string db_name)
{
  if (sqlite3_open(db_name.c_str(), &dbH) != SQLITE_OK)
    {
      cout << "Failed to open DB : " << sqlite3_errmsg(dbH) << endl;
      abort();
    }
  else
    {
      cout << "Opened database: " << db_name << endl;
    }

  if (sqlite3_exec(dbH, "PRAGMA synchronous = OFF", NULL, NULL, NULL) != SQLITE_OK)
    {
      cout << "Failed to set synchronous: " << sqlite3_errmsg(dbH) << endl;
    }

  if (sqlite3_exec(dbH, "PRAGMA journal_mode = WAL", NULL, NULL, NULL) != SQLITE_OK)
    {
      cout << "Failed to set journal mode: " << sqlite3_errmsg(dbH) << endl;
    }

  cout << "dbH 2: " << dbH << endl;

}

int main()
{
  sqlite3 * dbH;
  dbH = NULL;
  cout << "dbH 1: " << dbH << endl;
  string dbName = "foo1.db";
  init_table(dbH, dbName);

  cout << "dbH 3: " << dbH << endl;
}

そして実行すると

$ ./a.out
dbH 1: 0
Opened database: foo1.db
dbH 2: 0x5baa048
dbH 3: 0
4

1 に答える 1

3

すべきか

int init_table(sqlite3 **dbH,  string db_name)  

そして、ポインターをポインターに渡しますか?
sqliter の扱いには問題ないのかもしれません。ポインターを参照として渡すか、ポインターへのポインターとして渡すかのいずれかです。

&dbHもちろん、渡しながら、変更後へ渡す必要がありますinit_table

于 2013-08-28T13:33:13.847 に答える