ファンクション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);
}
'string 'を後で取得するためにバイナリ形式で保存することはできません。ポインタには、ポインタが含まれています。それをシリアル化する必要があります。 (または配列を使用してください) – molbdnilo
[* serialization *](https://en.wikipedia.org/wiki/Serialization)の件名を調べることをお勧めします。複雑なデータ構造(そして 'yes :: std :: string'は1つです)は、オブジェクト自体のビット単位またはバイト単位のダンプでは実際には格納できません。 –
構造のシャローコピーを実行しています。これは、文字列オブジェクト(文字列)が保持するデータではなく、文字列オブジェクトをコピーすることを意味します。実際の文字列はダイナミックメモリに格納されます。構造体の文字列インスタンスにポインタのみが保持されます。 –