4

libpqxx ライブラリを使用して、非常にシンプルでわかりやすい接続プールを開発しようとしています。私はC ++にまったく慣れていないので、ポインターと参照についてまだ非常に混乱しています。クラスの動作は非常に単純です。初期化された接続を持つベクターを用意し、必要なときに接続をベクターにポップおよびプッシュします。ポインターと参照の不適切な実装により、コードには多くのエラーがあります。ヒントを教えてください。

編集:すべてのコンパイル エラーを修正できました。メイン関数を実行すると、セグメンテーション違反が発生します。

class DbPool {

公衆:

pqxx::result runQuery(const string& query) {

    connection *conn = getCon();
    work trans(*conn);
    result res = trans.exec(query);
    trans.commit();
    releaseCon(conn);

    return res;
}

DbPool(uint32_t max_cons) {

    for (uint32_t i = 0; i < max_cons; i++) {

        connection* con = createCon();
        m_freeCons.push_back(shared_ptr < connection > (con));
    }
}

プライベート:

connection * createCon() {

    connection * conn =
            new connection(
                    "user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
    return conn;
}

void releaseCon(connection *con) {

    m_freeCons.push_back(shared_ptr < connection > (con));
}

connection* getCon() {

    shared_ptr < connection > conn = *(m_freeCons.end() - 1);
    m_freeCons.pop_back();
    return conn.get();
}

vector<shared_ptr<connection> > m_freeCons;

};

int main(int argc, char *argv[]) {
     DbPool *pool = new DbPool(5);
     result res = pool->runQuery("SELECT COUNT (*) from captures");
     return 0;
}
4

2 に答える 2

2

設計上の問題が心配な場合は、ここに 5 セントを示します。

  • コードは実際にコンパイルされますか? あなたはconnection へのポインタのベクトルを持っているので、私はそうではないと思いますが、接続オブジェクトをプッシュバックしています( m_freeCons.push_back(*con);-接続へのポインタを*逆参照します)...
  • 通常、変更可能なハンドルをメンバーに渡すのは悪い考えです (getConメソッドで行っているように、少なくとも、connection const *可能であれば代わりにa を返します)。
  • ポインターのコレクションを使用する必要がある場合はshared_ptr、生のポインターの代わりに使用することを検討してください。そうすれば、メモリの解放について心配する必要がなくなります。またはBoost.PointerContainerを使用します。こちらもご覧ください
  • 奇妙なスタイルの問題です: なぜあなたは を使うのreturn &(*conn)ですか? これはポインターconnを逆参照し、そのアドレスを再度取得します。return conn代わりに、単に!と書くことができます。

sで書き直した質問への回答shared_ptr: new で接続を作成し、その周りに shared_ptr をラップする必要があります。たとえば createCon の場合:

connection * createCon(){

    connection * conn = new connection("user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
    return conn;
}

    connection* con = createCon();
    m_freeCons.push_back(shared_ptr<connection>(con));

他の場所でも同様です。

于 2012-09-21T10:00:28.947 に答える