2017-12-15 6 views
0

私のデータベースにある表には、1つのBLOB型の列があります。構造体に文字列を使用するとセグメンテーションエラーが発生する

私は上記の構造体の変数を使用してこのBLOBを取得するC++関数を作成しました。私はそのために関数cass_value_get_bytesを使用しています。

上記の構造を使用すると、セグメント化エラーが発生するという問題があります。しかし、文字列型を文字配列に変更すると、問題は解決します。 なぜ私は文字列変数を使うことができないのか理解できません。なぜなら、文字配列よりも文字列を使うほうがずっと賢いからです。

+7

'string 'を後で取得するためにバイナリ形式で保存することはできません。ポインタには、ポインタが含まれています。それをシリアル化する必要があります。 (または配列を使用してください) – molbdnilo

+1

[* serialization *](https://en.wikipedia.org/wiki/Serialization)の件名を調べることをお勧めします。複雑なデータ構造(そして 'yes :: std :: string'は1つです)は、オブジェクト自体のビット単位またはバイト単位のダンプでは実際には格納できません。 –

+1

構造のシャローコピーを実行しています。これは、文字列オブジェクト(文字列)が保持するデータではなく、文字列オブジェクトをコピーすることを意味します。実際の文字列はダイナミックメモリに格納されます。構造体の文字列インスタンスにポインタのみが保持されます。 –

答えて

2

ファンクションcass_value_get_string()およびcass_value_get_bytes()は、有効期間がCassResultにバインドされているバッファにポインタを戻します。結果が削除されると値のメモリも削除されます。メモリを文字列のバッファにコピーする必要があります。 cass_value_get_string()はブロブにも使用でき、reinterpret_cast<>を実行する必要はありません。

#include <cassandra.h> 
#include <string> 

std::string to_string(CassValue* value) { 
    const char* str; 
    size_t len; 
    cass_value_get_string(value, &str, &len); 
    return std::string(str, len); 
} 

struct SomeData { 
    int x; 
    std::string y; 
}; 

int main() { 
    SomeData data; 
    CassValue* value = NULL; /* This needs to be set from the result */ 
    data.y = to_string(value); 
} 
+0

'cass_value_get_string()'と 'cass_value_get_bytes()'関数の結果をエラーでチェックしたいと思うかもしれませんが、簡潔にするために省略しました。 – mikep

+0

blob(私の場合は、異なる型のデータメンバを持つ構造体によって生成された整数と文字列)は、cass_value_get_string()を使ってどのように抽出できますか? –

+0

申し訳ありませんが、私はあなたがもともと尋ねていたものを誤解していたと思います。整数と文字列をBLOBでエンコードするのではなく、別々にCassandraに格納できますか?さもなければ、あなたのデコードを助ける方法を理解するために、あなたのBLOBのシリアライゼーションフォーマットに関するより多くの情報が必要です。 – mikep

関連する問題