私はQtの例 "表モデルの例" という例でQtの表モデル例
で探していますが、connection.h中のcreateConnection()メソッドは、次のコードが含まれています私のコードでこの例を複製しました。私はそれについて2つのことを理解していません。
ローカル変数dbは、createConnection()関数(RAIIを参照)の最後で破棄されます。私のデータベースは初期化する必要はなく、 "db"変数を使用していないので、なぜこのコードが必要なのかわかりません。しかし、私がそれを削除すると、私のプログラムは私の既存のデータベースからの読み込みに失敗します。 dbの破壊がデータベースを閉じて、それを利用不可能にすることが期待されます。しかし、私はdb変数に触れていないので、なぜデータベースにアクセスする前に作成して破壊する必要がありますか?どこでもdb変数を使用せず、コードが呼び出される前に破棄されるので、なぜcreateConnection()関数を呼び出す必要があるのか分かりません。一方、私はどのようにデータベースを開き、例外的に安全なRAIIコードを持つ変数破壊を引き起こすのか分かりません。
db.open()が失敗することはありません。私はデータベースを持っていない場合、それはそれを作成し、空白のものを開きます。私はデータベースを持っていればそれを開きます。私はデータベースを持っていて、なんらかの理由でオープンに失敗した場合、作成したくないので、何かが間違っているのでエラーが欲しい。空のデータベースを開くことは、私にとっては厄介なことに過ぎません。このケースをどうやって処理するのですか?
私はQt初心者ですが、C++で非常に経験があります。このコードは私にはほとんど意味がありません。私はdb変数の寿命がオープンデータベースの寿命であると期待します。例でコード化されているように、私はこのコードがどのようにリソースリークを起こしていないか見当たりません。私が知ることから、dbを初期化すると、何らかの種類のグローバルリソースがオープンし、db変数が破棄されてリークが発生した後でもオープンされたままになります。
これは非常に混乱しています。
Thx。
H Osタイル
'QSqlDatabase'はかなり奇妙なクラスです。そのドキュメントを読んでください:それはあなたが思うように行動しません。 RAIIクラスではありません。 –