0

列ストア データベース システムの実装にメモリ割り当ての問題があります。これは特に、データベースにテーブルをインポートするための MySql コネクタの実装の一部です。

次のベクトルがあるとします。

 std::vector <void *> data;

次のように、ポインターにデータを追加するための型をチェックする関数があります。

for(int c = 0; c != numCols; c++){

      // ...
      case BOOL_TYPE: {
                 bool *b;
                 data.push_back((void *) b);
             }
             break;
      // ... 
}

ここで、テーブル行を読み取る別の関数でデータを追加する必要があります

    while (mysqlpp::Row row = res.fetch_row()) {
                    for (int c = 0; c != numCols; c++) {
                        // ...
                        switch (colType){
                    case BOOL_TYPE: {
                        if(!isNull){
                            bool val = row[c];
                            data[c] = new char[sizeof(val)];
                            data[c] = val;
                        }
                    }
                    break;

                   //... more types

                }



                    }
   }

私はこれらの行について心配しています:

 data[c] = new char[sizeof(val)];
 data[c] = val;

私は C++ とメモリ管理に非常に慣れていないので、毎回 void * により多くのメモリを割り当てて値を追加する方法がわかりませんか?

EDIT これは、行ではなく列にデータを格納している列ストアデータベース用です。明確にするために、行ストア データベースである mySQL からデータを列に追加するクリーンな方法が必要です。

MySql ++を使用してテーブル内の行数を取得できる場合、私の問題を簡単に解決できますか? 次に、最初にその数の行 * (datattype のサイズ) バイトを割り当てて、このメモリを埋めることができます。

4

2 に答える 2

0

あなたが持っているコードで動作する可能性のある迅速な(そして私の意見では)汚い解決策は、ポインタを上書きせずにデータをコピーすることです。様々な瞬間)。

まず、単に初期化する代わりに、後で解放できるメモリを割り当てます。

case BOOL_TYPE: {
    data.push_back(new bool);
    break;

次に、適切なデータを設定するときは、最初に既存のメモリを解放し、値を設定しながら再割り当てします。

case BOOL_TYPE: {
    if(!isNull){
        delete data[c];
        data[c] = new bool(row[c]);
    }
}
break;
于 2014-02-27T18:56:34.473 に答える