2016-12-27 2 views
0

redisでのPOD構造体の格納はconst char *で正常に動作しますが、std::stringが含まれていると正しく動作しません。私はラインを交換する場合キーがstd :: stringとして定義されている場合、redisに格納されたポッド構造体の非直列化は失敗します

のconstのchar *例

#include <hiredis/hiredis.h> 
#include <string.h> 
#include <string> 
#include <iostream> 

using namespace std; 

struct Test 
{ 
    const uint32_t id; 
    const char *name; 
}; 
int main() { 
    redisContext *context = redisConnect("127.0.0.1", 6379); 
    if (context == NULL || context->err) { 
     if (context) { 
      printf("Error: %s\n", context->errstr); 
     } else { 
      printf("Can't allocate redis context\n"); 
     } 
     exit(EXIT_FAILURE); 
    } 

    Test obj = {(uint32_t) 123, "foo bar"}; 

    const size_t size = 2 * sizeof(uint32_t) + (strlen(obj.name) + 1); 

    cout << "object{id: " << obj.id << ", name:' " << obj.name << "'}; size: " << size << endl; 

    redisReply *reply = 0; 

    const char *key = strdup("some-key"); 
    reply = (redisReply *) redisCommand(context, "SET %b %b", key, strlen(key), &obj, size); 

    if (!reply) 
     return REDIS_ERR; 

    freeReplyObject(reply); 

    reply = (redisReply *) redisCommand(context, "GET %s", key); 
    if (!reply) 
     return REDIS_ERR; 

    Test *res = (struct Test*) reply->str; 
    cout << "result{id: " << res->id << ", name:' " << res->name << "'}; size: " << size << endl; 

    freeReplyObject(reply); 
    redisFree(context); 
} 

const char *key = strdup("some-key"); 
    reply = (redisReply *) redisCommand(context, "SET %b %b", key, strlen(key), &obj, size); 

実行が常にセグメンテーションフォールトで終わる

std::string key("some-key"); 
reply = (redisReply *) redisCommand(context, "SET %b %b", key.c_str(), key.size(), &obj, size); 

と。

私は自分で問題を解決することはできません。本当に助けていただければ幸いです。

+2

'std :: string'を含む構造体はもはやPODではありません! –

+0

ですが、structにはstd::stringが含まれていません。キーはstd::stringオブジェクトです。 – palik

+1

コメントのようにコードをレンダリングすることはできません。 backticks '' 'を使用する –

答えて

-2

OK、私はそれを得た:redisCommand番目のステートメント

reply = (redisReply *) redisCommand(context, "GET %b", key.c_str(), key.size()); 

の 交換は、問題を解決しました。

+1

それは間違っています。 –

+0

コメントありがとうございます。しかし何が間違っているのか説明できますか? – palik

+0

なぜあなたは 'key'型のアドレスを渡していますか?第3引数の目的は何ですか?そのタイプでもっと「POD」のものをするならば、バグを別の機能に移すだけでした。 – PaulMcKenzie

関連する問題